在Spring中将bean交给IOC容器常用的几个注解
- @Autowired
- @Qualifier
- @Named
- @Resource
- @Inject
Spring自动装配的四种类型
- byName就是会将与属性的名字一样的bean进行装配。
- byType就是将同属性一样类型的bean进行装配。
- constructor就是通过构造器来将类型与参数相同的bean进行装配。
- autodetect是constructor与byType的组合,会先进行constructor,如果不成功,再进行byType。
Spring提供支持
@Autowired
- @Autowired注解是byType类型的,这个注解可以用在属性上面,setter方面上面以及构造器上面。
- 使用这个注解时,就不需要在类中为属性添加setter方法了。但是这个属性是强制性的,也就是说必须得装配上,如果没有找到合适的bean能够装配上,就会抛出异常NoSuchBeanDefinitionException。这时可以使用required=false来允许可以不被装配上,如果required=false时,则不会抛出异常。另一种情况是同时有多个bean是一个类型的,也会抛出这个异常。此时需要进一步明确要装配哪一个Bean,这时可以组合使用@Qualifier注解,值为Bean的名字即可。
@Qualifier
- @Qualifier注解使用byName进行装配,这样可以在多个类型一样的bean中,明确使用哪一个名字的bean来进行装配。@Qualifier注解起到了缩小自动装配候选bean的范围的作用。
JavaEE提供支持
@Inject
- @Inject注解与 @Autowired注解功能类似,搭配 @Name使用。
@Named
- @Named注解与 @Qualifier注解功能类似,用于指定BeanName。
@Resource
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- 如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。