Autowired乙個介面有多個實現類

2021-09-19 15:14:46 字數 1923 閱讀 1716

@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...