使用注解方式实现Spring IoC
16-@Resource和@Autowired注解的区别?
Bean注入有@Resource和@Autowired两种方式,这两种注解是什么意思,它们有什么区别?
@Resource
@Resource注解属于J2EE,有两个属性:name和type,而Spring将@Resource注解的name属性解析为bean的名称,type属性则解析为bean的类型。@Resource默认按名称进行装配,名称可以通过name属性进行指定。
@Autowired
@Autowired注解属于Spring,默认按照类型装配,默认情况下要求依赖对象必须存在。
@Resource与@Autowired的区别:
- @Resource和@Autowired都可以用来装配bean,都可以写在字段或setter方法上.
- @Autowired允许null值存在,需要将required属性设置为false。例如:@Autowired(required=false)
- @Autowired想使用名称装配,需要结合@Qualifier注解进行使用。在@Autowired配合@Qualifier使用时,会按照@Qualifier注解添加的名称进行注入。如:@Autowired @Qualifier(“userDao”)就是按照userDao名称进行装配,从而解决@Service重名的问题
- @Resource默认按照名称进行装配,如果没有指定name属性,注解写在字段上时,默认是取字段名作为名称进行查找。如果注解写在setter方法上则默认是取属性的名称进行装配。当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。
- @Resource装配顺序如下:
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定name也没有指定type,则自动按照byName的方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。