背景
常常見到如下代碼
@Bean
public TestBean testBean() {TestBean t = new TestBean();System.out.println("testBean:" + t);return t;
}@Bean
public FooBean fooBean() {TestBean t = testBean();System.out.println("這里看似是自己new的,但因為當前fooBean被spring容器管理,所以里面" + t);return new FooBean(t);
}
即在 @Bean
方法里調用另外一個產生bean的方法 fooBean()
,這看著像java里的內部調用
很正常會懷疑,這不就是自己手工又創建了一個bean?會不會跟spring容器創建的那個不一樣? 會不會重復創建?
實際是不會的,因為 fooBean()
本身也是被 @Bean
標注的,所以spring容器會在你調用 testBean()
的時候知道容器里已經有TestBean實例,所以會把已經存在的那個TestBean返回給 t 變量
實際測試打印的日志,哈希碼是一樣的,能證明是同一個對象
但是下面結論不一樣
@Bean
public TestBean testBean() {TestBean t = new TestBean();System.out.println("testBean:" + t);return t;
}@Bean
public FooBean fooBean() {TestBean t = newTest();System.out.println("這里看似是自己new的,但因為當前fooBean被spring容器管理,所以里面" + t);return new FooBean(t);
}public TestBean newTest() {return new TestBean();
}