将 Spring 字段注入转换为构造函数注入(IntelliJ IDEA)?

Convert Spring field injection to constructor injection (IntelliJ IDEA)?

我确信将我的 Spring Java 字段注入 [@Autowired] 转换为构造函数注入(among other reasons,以促进模拟单元测试)...

是否有一个实用程序可以用来自动执行 Spring 字段到构造函数注入的转换?

例如,IntelliJ IDEA 有很多东西的生成快捷方式(即:为字段生成 setter 和 getter);我希望有类似的东西......当手动进行转换很乏味时,这特别有用,因为要转换的 class 已经有许多字段注入字段。

开箱即用。

我的做法是搜索并替换
@Autowired private@Autowired private final.

然后显示错误,说最终字段未初始化。
如果您执行自动完成 (Alt+Enter),那么它会询问您是否要创建构造函数,然后您可以 select 字段并单击 Enter。

私人只是一个例子。它可以是任何修饰符。最主要的是让字段最终化,这样 Idea 就会报错,我们可以启动自动完成来生成所需的构造函数

是的,现在已在 IntelliJ IDEA 中实现。

1) 将光标放在 @Autowired 注释之一上。

2) 命中 Alt+Enter.

3) Select Create constructor

这是quick fix related to the inspection "Field injection warning":

Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

Field injection/NullPointerException example:

class MyComponent {

  @Inject MyCollaborator collaborator;

  public void myBusinessMethod() {
    collaborator.doSomething(); // -> NullPointerException   
  } 
}   

Constructor injection should be used:

class MyComponent {

  private final MyCollaborator collaborator;

  @Inject
  public MyComponent(MyCollaborator collaborator) {
    Assert.notNull(collaborator, "MyCollaborator must not be null!");
    this.collaborator = collaborator;
  }

  public void myBusinessMethod() {
    collaborator.doSomething(); // -> safe   
  }
}