文章

构造器注入还是setter注入

2022.6.27 ・ 共 459 字,您可能需要 1 分钟阅读

Tags: Spring

一个经常会遇到的问题,在使用 Spring 作为容器管理 Bean 的时候的依赖问题。

在 Spring Framework 6.0 的文档中介绍如下。

Since you can mix constructor-based and setter-based DI,  it is a good rule of thumb to use constructors for mandatory dependencies and setter methods or configuration methods for optional dependencies. Note that use of the @Autowired annotation on a setter method can be used to make the property be a required dependency; however,  constructor injection with programmatic validation of arguments is preferable.

The Spring team generally advocates constructor injection,  as it lets you implement application components as immutable objects and ensures that required dependencies are not  null . Furthermore,  constructor-injected components are always returned to the client (calling) code in a fully initialized state. As a side note,  a large number of constructor arguments is a bad code smell,  implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns.

Setter injection should primarily only be used for optional dependencies that can be assigned reasonable default values within the class. Otherwise,  not-null checks must be performed everywhere the code uses the dependency. One benefit of setter injection is that setter methods make objects of that class amenable to reconfiguration or re-injection later. Management through JMX MBeans is therefore a compelling use case for setter injection.

Use the DI style that makes the most sense for a particular class. Sometimes,  when dealing with third-party classes for which you do not have the source,  the choice is made for you. For example,  if a third-party class does not expose any setter methods,  then constructor injection may be the only available form of DI.

大致意思:

  1. 强制依赖通过构造器的形式或setter 带 @Autowired注解,可选依赖使用 setter。
  2. 更推荐构造器,有几个优点。
    1. 确保依赖 final。
    2. 确保依赖不为空。
    3. 在被使用的时候是完全初始化的。
  3. 不要对大量参数使用构造器注入。考虑重构。
  4. setter 注入用于可选依赖,对使用的地方进行非空检查。优点是可以重复注入。
  5. 随机应变。