Spring 中的自动装配方法 - 下面两种可能的替代方案之间的区别

Hop*_*ing 2 spring spring-mvc spring-boot

我有一个基本的自动接线问题。我看到以下两种在 Spring 自动装配中可能的实现

方法一

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)

方法二

public class SimpleMovieLister {

@Autowired
private MovieFinder movieFinder;
}
Run Code Online (Sandbox Code Playgroud)

我的理解是两者是相同的,我在我的代码中使用了很多 Method2。Method1 在哪些情况下有用?或者这只是 Spring 进化的一个例子,我们有两种可能的实现方式。

对不起,如果问题太基本了,但我需要澄清一下

Kyl*_*son 5

方法 1 是Setter注入。

方法二是注入。

第三种方法是构造函数注入

示例

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired
public SimpleMovieLister(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}
Run Code Online (Sandbox Code Playgroud)

方法 3,构造函数注入是首选,因为它使测试变得更加容易,因为您可以传入所需的依赖项。

此外,如果您Bean只有 1 个构造函数,那么您可以省略@Autowired注释。Spring 将在创建 bean 时自动选择该构造函数方法。

文档中的一个很好的片段:

Spring 团队通常提倡构造函数注入,因为它可以将应用程序组件实现为不可变对象,并确保所需的依赖项不为空。此外,构造函数注入的组件总是以完全初始化的状态返回给客户端(调用)代码。作为旁注,大量的构造函数参数是一种糟糕的代码味道,这意味着该类可能有太多的责任,应该重构以更好地解决适当的关注点分离问题。

Setter 注入应该主要仅用于可以在类中分配合理默认值的可选依赖项。否则,必须在代码使用依赖项的任何地方执行非空检查。setter 注入的一个好处是 setter 方法使该类的对象可以在以后重新配置或重新注入。因此,通过 JMX MBean 进行管理是 setter 注入的一个引人注目的用例。

使用对特定类最有意义的 DI 样式。有时,在处理您没有源的第三方类时,选择是为您做出的。例如,如果第三方类不公开任何 setter 方法,则构造函数注入可能是 DI 的唯一可用形式。