[英]What's the best practice of Spring/Spring boot chained bean instantiation?
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 中,因为只有一个 ServiceA 实例, new ServiceB()
只被调用了一次)。
我在之前的应用程序中使用了第一种策略,但最近我发现第二种策略有助于编写测试用例,因为我不需要加载 spring 上下文(或手动实例化所有链接组件以创建父组件),因此测试是快多了。
这两种策略都只实例化了 ServiceA 和 ServiceB 的一个实例
正确,只要该代码是整个代码,但是......
如果您以后有一个ServiceC
也想使用ServiceB
,则第二个策略不能重用ServiceB
单例。 第一种策略无需重构代码即可工作。
使用第一个策略。
我发现第二种策略有助于编写测试用例
错误的。 第二个策略排除编写单元测试,因为您不能使用模拟ServiceB
实现实例化ServiceA
以仅测试ServiceA
代码,即“单元”。
使用第二种策略, ServiceB
代码中的错误将使ServiceA
看起来有缺陷,即使ServiceA
是完美的。
使用第一个策略。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.