春季自动装配的方法 - 以下两种可能的替代方案之间的差异

时间:2017-08-01 14:36:08

标签: spring spring-mvc spring-boot

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

方法1

getData() {
  let guideList = '';
    this.getChildren(event.node)
      .subscribe(
        function(data) {
          console.log('here');
          guideList = data.join(',');
        },
        function(err) {
          console.log('error');
        },
        function() {
          console.log('done');
          console.log(guideList);
        }
      );
}

getChildren(node: TreeNode) {
  const nodeIds$ = new BehaviorSubject([]);
  //doForAll is a promise
  node.doForAll((data) => {
    nodeIds$.next(nodeIds$.getValue().concat(data.id));
  });
  return nodeIds$;
}

方法2

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired
public void setMovieFinder(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}

我的理解是两者都是一样的,我在代码中使用了很多Method2。 Method1有用的情况是什么?或者它只是Spring演变的一个案例,我们有两种可能的实现方式。

很抱歉,如果问题太基础,但我需要清理它

2 个答案:

答案 0 :(得分:4)

方法1是Setter注射。

方法2是字段注入。

第三种方法是Constructor注射

示例

public class SimpleMovieLister {

private MovieFinder movieFinder;

@Autowired
public SimpleMovieLister(MovieFinder movieFinder) {
    this.movieFinder = movieFinder;
}
// ...
}

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

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

来自docs的好片段:

  

Spring团队一般都主张构造函数注入   使一个人能够将应用程序组件实现为不可变对象   并确保所需的依赖项不为null。此外   构造函数注入的组件总是返回给客户端   (调用)处于完全初始化状态的代码。作为旁注,大   构造函数参数的数量是一个糟糕的代码气味,暗示着   班级可能有太多的责任,应该重构   更好地解决问题的正确分离。

     

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

     

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

答案 1 :(得分:0)

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html

方法1是setter Injection

  

Setter注入应主要仅用于可选   可以在其中分配合理默认值的依赖项   类。否则,必须在所有地方执行非空检查   代码使用依赖项。 二传手注射的一个好处是   setter方法使该类的对象适合重新配置   或稍后重新注入

方法2是字段注入