【问题标题】:Convert Spring field injection to constructor injection (IntelliJ IDEA)?将 Spring 字段注入转换为构造函数注入(IntelliJ IDEA)?
【发布时间】:2017-05-16 18:27:08
【问题描述】:

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

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

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

【问题讨论】:

  • 我不知道。
  • 没有开箱即用的东西。我的做法是,我搜索并将@Autowired private 替换为@Autowired private final。然后显示一个错误,提示最终字段未初始化。如果您执行自动完成(Alt+Enter),那么它会询问它是否要创建一个构造函数,然后您可以选择字段并输入。就是这样。
  • @pvpkiran 这听起来像是一个很好的解决方法。下次有机会我会在私人可以接受的地方尝试一下。
  • 当然,private 只是我给你的一个例子。它可以是任何修饰符。主要是使字段最终化,这样 Idea 就会报错,我们可以启动自动完成以生成所需的构造函数
  • @cellepo @meese 让我将其添加为 aswer,因为很多人都遇到了这个问题。

标签: java spring intellij-idea dependency-injection constructor-injection


【解决方案1】:

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

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

2) 点击Alt+Enter

3) 选择Create constructor

这是与inspection“字段注入警告”相关的quick fix

Spring Team 建议:“始终使用基于构造函数的依赖项 注入你的豆子。始终将断言用于强制 依赖”。

字段注入/NullPointerException 示例:

class MyComponent {

  @Inject MyCollaborator collaborator;

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

应该使用构造函数注入:

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   
  }
}

【讨论】:

  • +1/接受新的“创建构造函数”上下文选项!但是关于Assert#notNull的问题:MyComponent的两个版本都会抛出collaboratornull的异常,那么Assert#notNull有什么优势呢?只是一个程序员可优化的消息参数?或者可能在 Spring-context-load-time 保证异常,而不是运行时可能性(通过#myBusinessMethod)?
  • 是否有一个 1-liner 来断言所有注入的变量非空?
  • @cellepo Assert#notNull 在对象构造时抛出 IllegalArgumentException,而不是在应用程序执行中的某个随机点抛出 NullPointerException。这是fail fast principle的一个应用程序。
  • @cellepo 我不确定是否有 1-liner 可以将所有注入的变量断言为非空,但您可以构建一个。
【解决方案2】:

没有开箱即用的东西。

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

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

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

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 1970-01-01
    • 2013-11-13
    • 2019-04-20
    • 2020-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多