註解@Autowired與@Resource的區別

共同點:

@Resource和@Autowired都可以作爲注入屬性的修飾,在接口僅有單一實現類時,兩個註解的修飾效果相同,可以互相替換,不影響使用。

注意:在只有單一的實現類時,兩個註解的作用相同

不同點:

  • @Resource是Java自己的註解,@Resource有兩個屬性是比較重要的,分是name和type;Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
  • @Autowired是spring的註解,是spring2.5版本引入的,Autowired只根據type進行注入,不會去匹配name。如果涉及到type無法辨別注入對象時,那需要依賴@Qualifier或@Primary註解一起來修飾。但是如果通過byType找到多個對象時,會通過byName進行比對。

在spring中@Autowired注入規則
@Autowired默認是按照byType進行注入的,但是當byType方式找到多個符合,則又按照byName方式比對,如果還有多個,則報出異常。

代碼演示:
1、只存在單一實現類

public interface TestBiz {
    void sendMsg(String msg);
}



@Service("testBizImpl")
public class TestBizImpl implements TestBiz {
    @Override
    public void sendMsg(String msg) {
        System.out.println("TestBizImpl實現類輸出信息msg:"+msg);
    }
}


單元自測方法
    @Autowired
    private TestBiz testbiz;

   // @Resource
    //private TestBiz testbiz;
    @Test
    public void test() {
        testbiz.sendMsg("報警:123213");
    }

上述使用@Resource註解和@Autowired註解均能輸出結果:
TestBizImpl實現類輸出信息msg:報警:123213

存在多個實現類

//新增一個實現類
@Service("bizTestImpl")
public class BizTestImpl implements TestBiz {
    @Override
    public void sendMsg(String msg) {
        System.out.println("BizTestImpl結果輸出");
    }
}


    @Resource
    private TestBiz testbiz;


    @Test
    public void test() {
        testbiz.sendMsg("報警:123213");
    }
    //上述代碼運行不成功,因爲Resource通過byName進行注入,我們將上述代碼換成
    @Resource(name="testBizImpl")
    private TestBiz testbiz;


    @Test
    public void test() {
        testbiz.sendMsg("報警:123213");
    }
    即在註解後添加name屬性,運行成功

爲了不再註解後添加name屬性,可以將實例對象名稱(瞭解不多,按照對象實例介紹),也可運行成功,如下:
===================
    @Resource
    private TestBiz testBizImpl;


    @Test
    public void test() {
        testBizImpl.sendMsg("報警:123213");
    }
即將實例名稱換爲對應的@Service中的名字,運行成功


=====================
如果要使用Autowired註解,因爲該註解沒有name屬性,只能通過這樣進行訪問,爲了演示調用另一個實現類中的方法

  @Autowired
    private TestBiz bizTestImpl;
    @Test
    public void test() {
        bizTestImpl.sendMsg("報警:123213");
    }

輸出:BizTestImpl結果輸出

TestBiz後面實例化的名稱只能是bizTestImpl和testBizImpl,即@Service註解後面的名稱;其餘均報錯
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章