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。我什至不知道这个符号是什么时候第一次使用的。
然而,与你想象的不同,这
a().makeB();
实际上并没有a()
直接调用该方法。
选项 1实际上并没有创建该类的另一个实例,而是调用被代理,并且如果没有Bean存在,则创建 Bean(到达方法),或者如果是单例,则重新使用。谢谢BeanFactory
!
CGLIB
在后台为你做了很多。
intercept:319, ConfigurationClassEnhancer$BeanMethodInterceptor
无论如何,就 IDE 内部的简单性和可用性而言,选项 2始终是要走的路。
使用选项 2,您还可以清楚地看到Bean的依赖关系。
解决性能问题,不,没有真正的区别。你不应该真正担心那些小细节。Spring 在任何地方都使用代理/拦截器。
推荐阅读
- excel - Excel中的自动更新时间戳
- java - 当元素存在于页面中但在视口中不可见时,Selenium findElement 会引发异常
- powershell - PowerShell 别名、PSScriptAnalyzer 和 VSCode
- momentjs - UTC 格式日(数字)显示不正确
- python - 从 pandas 中缺少行的两个表创建最完整的表
- java - 在多个列表中查找交集
- android - 如何在单元测试中使用协程测试 livedata
- forms - 仅当聚焦于颤动时,如何在 TextFormField() 上显示计数器文本?
- html - 如何使剑道网格中的 headerTemplate 条件起作用
- r - 在R中使用多个模拟条件子集数据帧