@Autowired与@Resource注解的区别与使用
@Autowired与@Resource注解
@Autowired与@Resource的介绍
@Autowired与@Resource的作用
- @Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法上。
@Autowired的介绍
- @Autowired是spring框架提供的注解, 包名为:
org.springframework.beans.factory.annotation.Autowired
- @Autowired按byType自动注入
- @Autowired默认按类型装配(
byType
),默认情况下必须要求依赖对象必须存在,如果要允许null 值,可以设置它的required属性为false(@Autowired(required=false)
) ,如果我们想使用名称装配可以结合@Qualifier
注解进行使用
@Resource的介绍
- @Resource是J2EE提供的注解, 包名为
import javax.annotation.Resource
- @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了。@Resource有两个属性是比较重要的,分是name和type,Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。所以如果使用name属性,则使用byName的自动注入策略,而使用type属性时则使用byType自动注入策略。如果既不指定name也不指定type属性,这时将通过反射机制使用byName自动注入策略。
@Autowired与@Resource的加载顺序
@Autowired的加载顺序
- 先通过byType的方式去寻找bean进行装配
- 如果找不到, 判断注入的bean是否为null值, 如果为null值且注解上没有required=false这个属性则抛出异常
- 如果注解中存在@Qualifier, 则会根据byName去装配bean
@Resource的加载顺序
- 如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
- 如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常
- 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
- 如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配
@Autowired与@Resource的使用区别
- @Autowired //默认按type注入
- @Qualifier(“testService”) //一般作为@Autowired()的修饰用
- @Resource(name=“testService”)//默认按name注入,可以通过name和type属性进行选择性注入
- 一般@Autowired和@Qualifier一起用,@Resource单独用。当然没有冲突的话@Autowired也可以单独用
- @Resource为java原生提供的注解, 使用优雅, 方便解藕, 建议使用