0

我注意到在使用多個@Configuration文件時,組件掃描和bean創建時出現歧義。彈簧多個@配置組件掃描模糊

比方說,我有配置方法級別的安全性,它需要掃描包含需要AOP代理的類的包。這些類依賴於其他類,也是其他類的依賴關係。

一切工作正常,直到我掃描相同的包在不同的配置,如在根配置。然後例如循環依賴關係bean創建開始出現。似乎根配置也​​嘗試實例化相同的對象,但當然不能這樣做,因爲在某些時候,AOP代理無法應用於此配置路徑中,並且依賴關係無法滿足。

一切工作,如果我最終準確的地方,我掃描什麼,但我很驚訝春天不能編排自動創建豆的訂單。這是真的嗎?還是有什麼可疑的事情發生?

回答

1

這不腥。這些bean存儲在一個AppContext中。 Spring的設計就像:在同一個環境中可以有兩個同一類的實例!如果通過配置兩次配置MyService,應該自動裝配哪個實例? 看到這個例子:

@Autowired 
private final MyService myService = null; 

因爲你的掃描工作了兩次,你有兩種可能的候選人注入和彈簧不能自動裝配,並給出了異常(在這種情況下春天尋找一個@Primary -Annotation,但是因爲你掃描了兩次,所以你有@Primary兩次 - 所以在這種情況下可能沒有幫助)。

什麼工作是讓客戶選擇這樣正確的服務:

@Autowired 
private final MyService[] myServices = null; 

這工作,你必須在陣列中的所有實例。

另一種選擇是在同一個應用程序中有兩個不同的AppContext。

+0

完全錯過了這個基本概念。我正在開發Web應用程序,因此有多個上下文不適合。從數組中選擇違反了框架透明度。我想我唯一的選擇是更多隔離包裝,但它有點反直覺,因爲安全是一個橫切關注。一個邏輯包中可能有多個ccc - >同一個包中的單個組件應該通過不同的配置實例化。在root配置中掃描這些組件會更有意義。我期待着一些有關管理多個配置層次結構的最佳實踐。 –

+1

安全HM?掃描一個軟件包也會加載第三方庫bean,掃描可以消除具體的控制,最好的做法可能是不掃描。 –

+0

我可以讓bean在配置文件* transactional *中創建嗎?據我所知,由@EnableTransactionManagement啓用的後處理器將代理用@ Transactional註釋的@ Services。定義'@ Bean'爲'@ Transactional'足夠了嗎? –