@Autowired注解与@Resource注解的区别(详细)
相信对现在java码农来说,@autowired跟@resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到。
一、注解的出处
@autowired是spring提供的注解,需要导入包org.springframework.beans.factory.annotation.autowired
@resource是由j2ee提供的注解,需要导入包javax.annotation.resource
也就是说@autowired是外部包导入的,而@resource是j2ee自己的
二、自动注入规则
@autowired默认按照bytype自动注入
@autowired采取的是按照类型进行自动注入的,autowired源码中只有一个属性required(稍后介绍)。
说明@autowired无法人为去干预注入规则的,然后当容器中同一类型的bean存在多个的话,@autowired该如何去选择呢,这时就需要@qualifier注解来帮忙了。
@qualifier跟@autowired来自同一包下,存在一个属性value,我们可以通过value属性来确定@autowired具体注入的是哪一个bean。
如果匹配不到对象时,将会抛出异常 beancreationexception。
如果匹配到多个对象时,也会抛出异常。
public class userservice { @autowired @qualifier(value="userdao1") private userdao userdao; private mandao mandao; @autowired public void setuserdao(@qualifier("mandao") mandao mandao) { this.mandao = mandao; } }
@resource默认按照byname自动注入
@resource注解在注入规则上存在两个属性:name、type
1、若没有使用属性,则通过反射机制,默认按照byname方式进行装配,如果没有匹配,则再类型进行装配;
2、若只使用了name属性,则使用byname的自动注入策略,从上下文中查找名称id,如果匹配不到则抛出异常;
3、若只使用了type属性,则使用bytype自动注入策略,从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个都会抛出异常;
4、若两个属性都使用了,则需要找到唯一匹配的bean进行装配,找不到则抛出异常。
public class userservice { @resource private userdao userdao; @resource(name="studentdao") private studentdao studentdao; @resource(type="teacherdao") private teacherdao teacherdao; @resource(name="mandao",type="mandao") private mandao mandao; }
三、注入时对象是否存在
@autowired:默认按照类型进行装配,默认情况下要求依赖的对象必须存在,如果需要允许null值,则需要设置required属性为false,@autowired(required=false)。
@resource:默认按照名称进行装配,允许为null。
四、使用位置
两者都可以写在字段和setter方法上,如果写在字段上,那么就不需要在写setter方法。
推荐使用@resource注解在字段上,这样不仅不需要写setter方法了,而且由于@resource属于j2ee,降低与spring的耦合。
推荐阅读
-
@Autowired注解与@Resource注解的区别(详细)
-
Spring框架中 @Autowired 和 @Resource 注解的区别
-
@Autowired 和 @Resource注解, 一个接口有多个实现类的时候Spring注入遇到的问题
-
JAVA面试之九—@Autowired和@Resource注解有什么区别?
-
@Resource 与 @Service注解的区别
-
mybatis注解 #与$的区别
-
spring注解@Autowired、@Resource的区别
-
spring注解@Autowired、@Resource的区别
-
@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
-
Spring@Autowired与@Resource的区别有哪些