繁体   English   中英

Spring/Spring 启动链式 bean 实例化的最佳实践是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM