我在項目中遇到了一個循環依賴的小問題,發現@Autowired在字段/設置器上使用可以解決這個問題,而不是@Autowired在構造函數上使用。這種行為的結論是 Spring 在 field/setter 注入的情況下注入代理,在構造函數注入的情況下注入實際的 bean。問題:這背后的原因是什么?為什么要注入不同的實體?考慮簡單的片段: @Component public static class A{ @Autowired B b; @Autowired C c; } @Component public static class B{ @Autowired B b; @Autowired C c;// public B(C c,B b) { // this would cause circular dep problem// this.c=c;// } } @Component public static class C{ @Autowired A a; @Autowired B b; }我想到的一個想法是,通過構造函數注入,您可以立即使用注入的實體,因此作為預防措施,初始化的 bean 被注入而不是代理,但另一方面,我可以在 setter 的情況下做同樣的事情方法,使接縫無效。
1 回答

慕斯709654
TA貢獻1840條經驗 獲得超5個贊
因此,當您使用構造函數注入時,必須更早地創建構造函數中使用的所有 bean。如果您有循環依賴項,則由于此循環依賴項和 spring throw 異常而無法創建它們。
當您使用 setter/field injection 注入的元素是在創建 bean 之后設置的,因此允許循環依賴。
順便說一句,如果您有循環依賴項,請嘗試重新設計您的應用程序,因為您的代碼將更難維護。這是為什么應該首選構造函數注入的原因之一。
添加回答
舉報
0/150
提交
取消