相同点:
@Autowired和@Resource作用基本相同,都是用于自动装配bean对象。都可以写在字段上,或写在setter方法上。
区别点:
1.出处不同
@Autowired(Spring注解,org.springframework.beans.factory.annotation.Autowired)
@Resource(JAVA注解,javax.annotation.Resource)
后者是JAVA注解,适用范围广,依赖小
2.自动装配策略不同
@Autowired 只能按类型匹配,如果要允许null 值,可以设置它的required属性为false, 如果使用按照名称装配,可使用@Qualifier注解;
@Resource 默认优先名称匹配, 具体装配策略如下:
a. 如果同时指定了name和type,则从Web容器上下文中找到唯一匹配的bean进行装配,找不到则抛出异常
b. 如果指定了name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常
c. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
d. 如果既没有指定name,又没有指定type,则将通过反射机制( 当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。) 使用 byName 自动注入策略进行装配;如果没有匹配,则 会按照类型装配( 对于字段注释,默认值为字段的类型。对于方法注释,默认值为 JavaBean 属性的类型。),都 找不到则抛出异常
b. 如果指定了name,则从上下文中查找名称匹配的bean进行装配,找不到则抛出异常
c. 如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常
d. 如果既没有指定name,又没有指定type,则将通过反射机制( 当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。) 使用 byName 自动注入策略进行装配;如果没有匹配,则 会按照类型装配( 对于字段注释,默认值为字段的类型。对于方法注释,默认值为 JavaBean 属性的类型。),都 找不到则抛出异常
3.其他区别
@Autowired 可以允许为 null。
@Resource 还 可以对类注解
如何选择:个人观点,仅供参考
前提@Autowired必须有Spring容器,剩下的主要看想byType还是b yName匹配策略了。如果偏向于接口编程,则肯定用@Autowired比较方便,书写简单。如果可能换Web容器,那可能优先@Resource比较好。
其他情况都差不多。