1 回答

TA貢獻1884條經驗 獲得超4個贊
類@Configuration不會在每次一個注解為 的方法@Bean調用另一個注解為 的方法時實例化一個新對象@Bean??紤]這個例子:
@Configuration
public class TestConfig {
? ? @Bean
? ? public String bean2(){
? ? ? ? String bean = bean1("bean2");
? ? ? ? System.out.println("bean2: " + bean);
? ? ? ? return bean;
? ? }
? ? @Bean
? ? public String bean3(){
? ? ? ? String bean = bean1("bean3");
? ? ? ? System.out.println("bean3: " + bean);
? ? ? ? return bean;
? ? }
? ? @Bean
? ? public String bean1(@Autowired(required = false) String name){
? ? ? ? System.out.println("bean1 " + name);
? ? ? ? return name;
? ? }
}
輸出如下,因為bean2()是先執行的:
bean1 bean2
bean2: bean2
bean3: bean2
這是相關文件:
換句話說,當您定義一個 bean 定義并將其限定為單例時,Spring IoC 容器會創建該 bean 定義定義的對象的一個實例。這個單個實例存儲在此類單例 bean 的緩存中,并且對該命名 bean 的所有后續請求和引用都返回緩存的對象。下圖顯示了單例作用域的工作原理:
在這種情況下,注釋為的方法@Bean
?是一個 bean 定義。
還:
所有 @Configuration 類都在啟動時使用 CGLIB 進行子類化。在子類中,子方法在調用父方法并創建新實例之前首先檢查容器中是否有任何緩存的(范圍內的)bean。
換句話說,@Bean
無論參數如何,每次調用帶注釋的方法都應該返回相同的 bean。depends-on
在您的情況下,我認為它是未定義的行為,因為除非您使用or之類的選項,否則不能保證實例化的順序SmartLifecycle
。
添加回答
舉報