Spring中的自动装配
@Autowire、 @Qualifier、@Primary
@Autowire
注解标注在constructor, field, setter method 上,方便在Spring中进行依赖的注入(dependency injection
)。和JSR-330标准javax.inject.Inject达到一样的效果,不过autowired时Spring持有的。
- 默认使用Autowire是按照类型进行注入的,但是如果在容器中存在多个类型相同的bean时,@Autowired也会按照名称进行匹配。
- 使用
@Qualifier
注解,在获取Bean时,指定要获取的bean的名称。 - 使用
@Primary
注解,在声明Bean时,指定如果注入,则首选的bean。
1 |
|
需要注意的是:在同时指定Qualifier和Primary时,会以Qualifier为主。
@Inject、@Named
@Inject、@Named 都是Javax规范的注解,并不是Spring的注解。
使用 Inject 注解同样能够标注在constructor, field, setter method 上。基本能够代替 Autowired 注解,并且能够使用 Named 注解,指定名称进行实例的注入,可以代替 Qualifier 注解。
1 |
|
区别点在于 Autowired 注解支持 required() 属性。而 Inject 注解并不支持。可以使用java.util.Optional或者Spring Framework 5.0 后提供的 @Nullable 注解,标志在构造方法上。
1 | public class SimpleMovieLister { |
@Resource
使用 @Resource
同样能够达到自动装配的目的,与 @Autowire
的区别在于以下几点:
- 处理这2个注解的BeanPostProcessor不一样
- 匹配Bean的方式不同。
@Resource
- 默认按照名称进行匹配注入。
- 如果指定了
type
,则按照类型进行匹配。当无法找到正确的类型或者找到多个时都会报错。如果都没有指定时,并且无法按照名称匹配到Bean时,会回退到按照类型寻找Bean。
@Autowire
默认就是按照类型进行匹配的,如果需要指定特定Bean,则需要使用@Qualifier
注解进行指定。