1. Overview

In this tutorial, we'll investigate the usage of JSR-330 annotations with Spring. We'll look at the @Inject, @Named, and @ManagedBean annotations.

2. Bean Definition with @Named

Let's first look at how we can define a bean with @Named.

The @Named annotation plays the role of @Component:

@Named
public class JsrPersonRepository {
    // Implementation details
}

Here, we're annotating the JsrPersonRepository class with @Named. As a result, Spring registers it as a bean.

3. Bean Definition with @ManagedBean

Now, we'll continue with the @ManagedBean annotation which also marks a class as a bean:

@ManagedBean
public class EmployeeService {
     // Implementation details
}

Similar to @Named, Spring registers the @ManagedBean annotated classes as beans.

4. Bean Wiring with @Inject

Now that we've defined our beans using @Bean or @ManagedBean, we'll look at next how we can define the bean dependencies.

For this purpose, we'll use the @Inject annotation which has similar behavior with @Autowired.

Firstly, we'll try the constructor injection:

@Named
public class JsrConstructorInjectionPersonService {

    private final PersonRepository personRepository;

    @Inject
    public JsrConstructorInjectionPersonService(PersonRepository personRepository) {
        this.personRepository = personRepository;
    }
}

Secondly, we'll look at the setter injection:

@Named
public class JsrSetterInjectionPersonService {

    private PersonRepository personRepository;

    @Inject
    public void setPersonRepository(PersonRepository personRepository) {
        this.personRepository = personRepository;
    }
}

Lastly, we'll see the field injection:

@Named
public class JsrFieldInjectionPersonService {

    @Inject
    private PersonRepository personRepository;
}

Next, let's look at how we can qualify our beans during the injection.

We'll first name our bean with the @Named annotation:

@Named("department")
public class DepartmentRepository {
}

Here, we're using the value of @Named to name our bean. As a result, Spring will register DepartmentRepository under the name of department.

Then, we'll again use @Named for qualification:

@Named
public class DepartmentService {

    private final DepartmentRepository departmentRepository;

    @Inject
    public DepartmentService(@Named("department") DepartmentRepository departmentRepository) {
        this.departmentRepository = departmentRepository;
    }
}

Here, we're using @Inject to trigger the auto-wiring process. Also, we're using @Named("department") to qualify the DepartmentRepository bean.

5. Summary

In this tutorial, we've investigated how we can use JSR-330 annotations with Spring.

Finally, check out the source code over on Github.