小编典典

Spring @Autowire on Properties vs Constructor

all

因此,由于我一直在使用 Spring,如果我要编写一个具有依赖关系的服务,我会执行以下操作:

@Component
public class SomeService {
     @Autowired private SomeOtherService someOtherService;
}

我现在遇到了使用另一种约定来实现相同目标的代码

@Component
public class SomeService {
    private final SomeOtherService someOtherService;

    @Autowired
    public SomeService(SomeOtherService someOtherService){
        this.someOtherService = someOtherService;
    }
}

这两种方法都可以,我理解。但是使用选项 B
有什么好处吗?对我来说,它在类和单元测试中创建了更多代码。(必须编写构造函数并且不能使用@InjectMocks)

有什么我想念的吗?除了向单元测试添加代码之外,自动装配的构造函数还有什么其他功能吗?这是进行依赖注入的更优选方式吗?


阅读 86

收藏
2022-05-18

共1个答案

小编典典

是的,实际上建议使用选项 B(称为构造函数注入)而不是字段注入,并且具有以下几个优点:

  • 清楚地确定了依赖关系。在测试或在任何其他情况下实例化对象时(例如在配置类中显式创建 bean 实例),没有办法忘记这一点
  • 依赖关系可以是最终的,这有助于提高健壮性和线程安全性
  • 您不需要反射来设置依赖项。InjectMocks 仍然可用,但不是必需的。您可以自己创建模拟并通过简单地调用构造函数来注入它们
2022-05-18