背景
常常见到如下代码
@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();
}