欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

@Autowired注解与@Resource注解的区别(详细)

程序员文章站 2023-11-02 14:47:28
相信对现在Java码农来说,@Autowired跟@Resource并不陌生,二者都可以自动注入,但是两者的区别很多时候并没有被注意到。 一、注解的出处 @Autowired是Spring提供的注解,需要导入包org.springframework.beans.factory.annotation. ......

相信对现在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的耦合。