关于spring @Bean里调用其他产生bean的方法
背景
常常见到如下代码
@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();
}