gpt4 book ai didi

java - Spring/Spring boot 链式 bean 实例化的最佳实践是什么?

转载 作者:行者123 更新时间:2023-12-02 01:06:26 25 4
gpt4 key购买 nike

在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 上下文(或手动实例化所有链式组件来创建父组件),因此测试速度要快得多。

最佳答案

the two strategies both instantiate only one instance of ServiceA and ServiceB

正确,只要该代码是整个代码,但是...

如果您稍后有一个 ServiceC 也想使用 ServiceB,则第二种策略无法重用 ServiceB 单例。第一个策略无需重构代码即可发挥作用。

使用第一个策略。

<小时/>

I found that the second strategy facilitates writing test cases

错了。第二种策略阻止编写单元测试,因为您无法使用模拟ServiceB实现实例化ServiceA来进行测试 ServiceA 代码,即“单元”。

采用第二种策略,ServiceB 代码中的错误将使 ServiceA 看起来有缺陷,即使 ServiceA 是完美的。

使用第一个策略。

关于java - Spring/Spring boot 链式 bean 实例化的最佳实践是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59997428/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com