共同點:
@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註解後面的名稱;其餘均報錯