java - Spring/Spring boot 链式 bean 实例化的最佳实践是什么?
问题描述
在 Spring/Spring boot 中,下面两种的实例化策略哪个更好?
第一的:
@Component
Class ServiceA{
ServiceB b;
public ServiceA(ServiceB b) {
this.b = b;
}
}
其中 ServiceB 也是@Component
。
第二:
@Component
Class ServiceA{
ServiceB b;
public ServiceA() {
this.b = new ServiceB();
}
}
其中 ServiceB 是没有 spring 注释的常规类。
据我所知,Spring 仅将@Component
类的一个实例实例化为单例。因此,如果我理解正确,这两种策略都只实例化了一个 ServiceA 和 ServiceB 实例(在方法 2 中,new ServiceB()
由于只有一个 ServiceA 实例,因此只调用了一次)。
我在以前的应用程序中使用了第一种策略,但最近我发现第二种策略有助于编写测试用例,因为我不需要加载 spring 上下文(或手动实例化所有链式组件以创建父组件),因此测试是快多了。
解决方案
这两种策略都只实例化一个 ServiceA 和 ServiceB 的实例
正确,只要该代码是整个代码,但是...
如果你以后有一个ServiceC
也想使用ServiceB
,第二种策略不能重用ServiceB
单例。第一种策略无需重构代码即可工作。
使用第一策略。
我发现第二种策略有利于编写测试用例
错误的。第二种策略排除了编写单元测试,因为你不能ServiceA
用模拟ServiceB
实现来实例化只测试代码,ServiceA
即“单元”。
使用第二种策略,ServiceB
代码中的错误会让人ServiceA
看起来有缺陷,即使ServiceA
是完美的。
使用第一策略。
推荐阅读
- python - Kotlin 将 Array 设置为 HashMap 的键
- build.gradle - 房间数据库注释导致运行时崩溃 M1
- soap - java中的ws枚举实现
- c++11 - 如何使用 c++11 decltype 可变参数模板?
- haskell - Haskell - 如何在错误输出中包含令牌?
- html - 如何在 div 元素中向右移动几个空格?
- java - 我可以在导入的库中为 bean 设置属性吗?
- mesibo - Mesibo -- 已关闭 On-Premise 但仍将 webhook 调用转到 On-Premise IP
- java - 如何在改造 android 中更改 json 顺序?
- ipaf - 使用 PAF 生成 pdf 文件