2011-04-12 135 views
4

我有一套複雜的bean和它們之間的依賴關係。所有豆類都注有@Service,@Repository@Controller,我使用@PostConstruct註釋。有一些循環依賴,但系統仍然被Spring正確初始化。瞭解Spring上下文初始化順序

然後我添加了一個簡單的控制器,只依賴於其中一個服務。理論上,系統應該能夠啓動,因爲理論上它可以先設置系統,然後再設置新的控制器。但是春天抱怨說,它不能建立上下文:

Error creating bean with name 'userService': Requested bean is currently in creation: Is there an unresolvable circular reference?

我能以某種方式幫助陽春如何訂購上下文初始化?我認爲主要問題是userService,它通過系統用於認證目的很多。

回答

7

最好的解決方案就是取消循環依賴;我還沒有遇到這樣的結構是有保證的情況。但是,如果你想堅持下去,那麼也許你的上述問題是由於這樣的事實,你有地方構造器注入:

循環依賴 如果使用構造器注入也可以編寫和配置類和bean,從而創建一個無法解析的循環依賴性場景。 考慮這樣一種場景,其中需要通過構造函數注入來提供類B的實例的類A以及需要通過構造函數注入來提供類A的實例的類B。如果您將類A和B的bean配置爲相互注入,則Spring IoC容器將在運行時檢測到此循環引用,並引發BeanCurrentlyInCreationException。

一個可能的解決這個問題是通過 制定者 而不是通過構造函數來編輯的一些 您的類的源代碼進行配置。 另一種解決方案是不使用 構造函數注入並僅使用 setter注入。換句話說, 雖然除了最稀罕的 的情況下通常應該避免,但有可能 與 配置循環依賴關係設置注入。不同於典型 情況下(不具有循環依賴), 豆之間的循環依賴甲 和豆乙將迫使豆 之一被注入到另一個之前 被完全初始化本身( 經典雞/蛋場景)。

相關問題