首页 > 解决方案 > 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。)?

标签: javaspring

解决方案


根本没有理由使用选项 1。我什至不知道这个符号是什么时候第一次使用的。
然而,与你想象的不同,这

a().makeB();

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

CGLIB在后台为你做了很多。

intercept:319, ConfigurationClassEnhancer$BeanMethodInterceptor

在此处输入图像描述


无论如何,就 IDE 内部的简单性和可用性而言,选项 2始终是要走的路。
使用选项 2,您还可以清楚地看到Bean依赖关系

解决性能问题,不,没有真正的区别。你不应该真正担心那些小细节。Spring 在任何地方都使用代理/拦截器


推荐阅读