我有一个基本的自动接线问题。我在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演变的一个案例,我们有两种可能的实现方式。
很抱歉,如果问题太基础,但我需要清理它
答案 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是字段注入