春季-自动装配与手动方法调用

时间:2019-03-09 20:00:39

标签: java spring

我看到了很多这样的例子(选项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)?

1 个答案:

答案 0 :(得分:2)

没有没有理由完全使用选项1 。 我什至不知道什么时候第一次使用这种符号。
但是,这与您的想法不同,

a().makeB();

实际上并没有直接调用方法a()
选项1 实际上是创建该类的另一个实例,而是调用是代理,而 Bean 是如果不存在,则创建(达到该方法);如果 singleton ,则重新使用。谢谢BeanFactory

CGLIB在后​​台为您做了很多。

intercept:319, ConfigurationClassEnhancer$BeanMethodInterceptor

enter image description here


无论如何,出于简化性和在IDE中的可用性的考虑,选项2 总是可行的方式。
使用选项2 ,您还可以清楚地看到 Bean 的依赖项

解决性能问题,不,没有真正的区别。而且您不应该真正担心那些次要的细节。 Spring到处都使用代理/拦截器