我看到了很多这样的例子(选项1):
@Bean A a(){
return new A();
}
@Bean B b(){
return a().makeB();
}
与(选项2)相比,此方法有什么优点:
@Bean A a(){
return new A();
}
@Bean B b(A a){
return a.makeB();
}
据我所知,使用选项1可以更轻松地在Bean之间导航(但是由于有了IDE的支持,在选项2中也很容易做到)。缺点是我想耦合了,所以在测试中很难覆盖bean B中的bean A,因为它是直接引用的(在选项1中)。
使用选项1是否还有其他特殊原因(例如,速度或smthn)?
答案 0 :(得分:2)
没有没有理由完全使用选项1 。
我什至不知道什么时候第一次使用这种符号。
但是,这与您的想法不同,
a().makeB();
实际上并没有直接调用方法a()
。
选项1 实际上是不创建该类的另一个实例,而是调用是代理,而 Bean 是如果不存在,则创建(达到该方法);如果 singleton ,则重新使用。谢谢BeanFactory
!
CGLIB
在后台为您做了很多。
intercept:319, ConfigurationClassEnhancer$BeanMethodInterceptor
无论如何,出于简化性和在IDE中的可用性的考虑,选项2 总是可行的方式。
使用选项2 ,您还可以清楚地看到 Bean 的依赖项。
解决性能问题,不,没有真正的区别。而且您不应该真正担心那些次要的细节。 Spring到处都使用代理/拦截器。