spring-@Autowired和@resource的區別

@Autowired 和@Resource的區別

主要是一點,自動注入優先級的問題:

@Resource : 優先級name > type

@Autowired :優先級qualifier > type > name


@Resource

  1. 是jdk的註解

  2. 優先以name屬性來注入bean。沒有name屬性,將以變量名名作爲name屬性值

    測試一:  
      //注入
        @Resource
        User user;
        
      //xml配置
        //類型不同但ID相同
        <bean id="user" class="com.ssm.pojo.People">
            <property name="name" value="test - user"/>
        </bean>
        //類型相同,但ID不同
        <bean id="user1" class="com.ssm.pojo.User">
            <property name="name" value="test-user1 "/>
        </bean>
    

    結果 :注入失敗

    失敗原因 :spring在注入name = user的bean時,但是類型不匹配

    結果分析 :證明了@resource優先匹配name屬性相同的bean,而不是匹配type屬性相同的bean。所以注入的是id相同的user,而不是類型相同的user1

  3. 再以類型來匹配bean,當容器中沒有name屬性對應的bean時

  4. @qualifier對resource不生效

    測試二:
    //注入
        @Resource
        @Qualifier("user1")
        User user;
        
      //xml配置如下
        <bean id="user" class="com.ssm.pojo.User">
            <property name="name" value="test - user"/>
        </bean>
        <bean id="user1" class="com.ssm.pojo.User">
            <property name="name" value="test-user1 "/>
        </bean>
    

    結果:注入的是user

    分析:@Qualifier(“user1”)沒有生效,以變量名作爲name屬性匹配bean,所以注入的是user


@autowired

  1. 是spring框架的註解

  2. 優先以@qualifier註解限制的bean來注入bean

    測試三: 
     //注入 
        @Autowired
        @Qualifier("user1")
        User user;
        
    //xml配置如下
        <bean id="user" class="com.ssm.pojo.User">
            <property name="name" value="test - user"/>
        </bean>
        <bean id="user1" class="com.ssm.pojo.People">
            <property name="name" value="test-user1 "/>
        </bean>
    

    結果: 注入失敗

    分析 : 以@Qualifier限定的id來匹配,所以注入的是user1, 導致注入的類型不同,而注入失敗。如果以type爲優先,那麼回優先注入user

  3. 沒有@Qualiifer,在以Type來注入

     測試四:  
       //注入
        @Autowired
        User user;
        
      //xml配置
        //類型不同但ID相同
        <bean id="user" class="com.ssm.pojo.People">
            <property name="name" value="test - user"/>
        </bean>
        //類型相同,但ID不同
        <bean id="user1" class="com.ssm.pojo.User">
            <property name="name" value="test-user1 "/>
        </bean>
    

    結果: 注入成功

    分析:優先以類型來注入,那麼使用的就是user1這個bean,類型相同,能夠注入成功。測試一中是以name爲優先級,所以注入失敗

  4. 最後在以name來注入,但是autowired沒有name屬性,所以默認以變量名作爲匹配

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章