首页 > 解决方案 > 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 上下文(或手动实例化所有链式组件以创建父组件),因此测试是快多了。

标签: javaspring-boot

解决方案


这两种策略都只实例化一个 ServiceA 和 ServiceB 的实例

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

如果你以后有一个ServiceC也想使用ServiceB,第二种策略不能重用ServiceB单例。第一种策略无需重构代码即可工作。

使用第一策略。


我发现第二种策略有利于编写测试用例

错误的。第二种策略排除了编写单元测试,因为你不能ServiceA用模拟ServiceB实现来实例化只测试代码ServiceA即“单元”。

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

使用第一策略。


推荐阅读