今天在寫業務代碼的時候遇到了Spring Bean之間產生循環依賴的問題,報錯信息為【The dependencies of some of the beans in the application context form a cycle】。
排查代碼,發現是我在A類中通過A類的構造函數注入了B類,而在B類中又通過B類的構造函數注入了A類導致的Spring Bean循環依賴問題。
Spring Bean的循環依賴問題,是指類A通過構造函數注入類B的實例(或者B中聲明的Bean),而類B通過構造函數注入類A的實例(或者A中聲明的Bean),即將類A和類B的bean配置為相互注入,則Spring IoC容器會在運行時檢測到此循環引用,並引發一個BeanCurrentlyInCreationException。與典型情況(沒有循環依賴)不同,Bean A和Bean B之間的循環依賴關系迫使其中一個Bean在被完全初始化之前被注入到另一個Bean中(典型的一個【先有雞還是先有蛋】場景)。
解決的方法就是不使用基於構造函數的依賴注入,可通過下面兩種方式達到目的:
1.在實例變量上使用@Autowired注解,讓Spring決定在合適的時機注入,而非在初始化類的時候就注入。
2.用基於setter方法的依賴注入取代基於構造函數的依賴注入來解決循環依賴。
"年輕的時候以為不讀書不足以了解人生,直到后來才發現如果不了解人生,是讀不懂書的。"