@autowired是spring的註解,預設使用的是bytype的方式向bean裡面注入相應的bean。例如:
@autowired
private userservice userservice;
這段**會在初始化的時候,在spring容器中尋找乙個型別為userservice的bean實體注入,關聯到userservice的引入上。
但是如果userservice這個介面存在多個實現類的時候,就會在spring注入的時候報錯,具體如下:
public class userservice1 implements userservice
public class userservice2 implements userservice
當存多個userservice的實現類時,錯誤資訊如下:
2016-08-05 14:53:53,795 error [org.springframework.test.context.testcontextmanager] -
org.springframework.beans.factory.beancreationexception: error creating bean with name 'userservicetest': injection of autowired dependencies failed; nested exception is org.springframework.beans.factory.beancreationexception: could not autowire field: private yjc.demo.service.userservice userservicetest.userservice; nested exception is he[yjc.demo.service.userservice] is defined: expected single matching bean but found 2: userservice1,userservice2
丟擲了org.springframework.beans.factory.beancreationexception,而原因是注入的時候發現有2個匹配的bean,但是不知道要注入哪乙個:expected single matching bean but found 2: userservice1,userservice2
那麼如何應對多個實現類的場景呢,看一下**:
@autowired
private userservice userservice1;
@autowired
private userservice userservice2;
@autowired
@qualifier(value = "userservice2")
private userservice userservice3;
@test
public void test()
執行結果:
class yjc.demo.serviceimpl.userservice1
class yjc.demo.serviceimpl.userservice2
class yjc.demo.serviceimpl.userservice2
執行結果成功,說明了2種處理多個實現類的方法:
1.變數名用userservice1,userservice2,而不是userservice。
通常情況下@autowired是通過bytype的方法注入的,可是在多個實現類的時候,bytype的方式不再是唯一,而需要通過byname的方式來注入,而這個name預設就是根據變數名來的。
2.通過@qualifier註解來指明使用哪乙個實現類,實際上也是通過byname的方式實現。
由此看來,@autowired註解到底使用bytype還是byname,其實是存在一定策略的,也就是有優先順序。優先用bytype,而後是byname。
禁止乙個介面有兩種用處
一般過程中,很少會乙個介面有兩種用處 有時為了偷懶或者smart,使用了介面的 可能會導致問題,而一般根據介面的含義很難發現還有其它地方呼叫 專案中傳輸資料有佇列,外部獲取佇列有個介面getdata,出現特殊情況會去flush佇列。當時為了smart,就呼叫了getdata來丟棄前面的資料 專案後期...
乙個關於 Autowired和AOP的問題
當我需要做乙個aop日誌時,出現的這個問題。首先,專案是spring cloud 的分布式架構,當我通過aop切api介面獲取到相關資訊後,就需要呼叫db服務的儲存日誌的介面,結果然後就報錯了,說這個fegin介面not found。給我氣得,這東西咋可能沒有注入。找了很多網路上關於aop 無法注入...
angular1 乙個頁面有彈窗
1 頁面regist.html有個彈窗 彈窗頁面batch.html 2 彈窗頁面的資料請求應該在regist.ctrl 也就是regist的控制器裡 3 如下regist.ctrl.js 彈窗裡面的方法和資料獲取應該都在主頁面裡面進行請求 1 顯示報案批次號詳情頁面 2 scope.batchde...