我读到,在setter注入中不能保证将依赖项注入,而不是在构造函数注入中必须依赖。
我真的不明白这一点。如果我编写以下方法:
@Autowired
public void setMyBean(MyBean otherBean){
this.otherBean = otherBean;
}
otherBean不会被注入意味着什么?
答案 0 :(得分:0)
DI存在两个主要变体:Constructor-based dependency injection和Setter-based dependency injection。
Constructor-based Dependency Injection
基于构造函数的DI是通过容器调用具有多个参数的构造函数来完成的,每个参数表示一个依赖项。
Setter-based Dependency Injection
基于Setter的DI是通过在调用无参数构造函数或无参数静态工厂方法以实例化Bean之后,在Bean上调用setter方法的容器来实现的。
同样,构造函数注入确保所有强制性属性均已满足,并且根本不可能以无效状态(未通过其协作者)实例化对象。换句话说,使用构造函数注入时,您不必使用专用机制来确保设置了必需的属性(普通Java机制除外)。
但是在基于setter的注入中,如果未找到依赖项,则创建对象,但是依赖对象将为null。意味着,setter注入不能确保依赖注入。您可以找到详细的文章here。
请注意,在setter方法上使用@Required批注可以使该属性成为必需的依赖项。
答案 1 :(得分:0)
如果在bean中使用基于setter的注入,那么不管所有依赖项是否已解决,bean都会初始化,但是当尝试在代码中使用这些未解决/初始化的依赖项时,您将获得NPE。 但是,在基于构造函数的注入中,一旦所有依赖关系都得到解决,您的bean将初始化。
答案 2 :(得分:0)
每当我们使用@Autowired
时, Spring 都会确保相关的 bean 存在并被注入使用。
如果无法完成此操作, Spring 会引发异常,并且应用程序无法启动。
该语句实际上是在测试您的代码。我的意思是,如果使用基于setter
的依赖项注入,则可能会忘记注入所需的bean,并且相应的测试用例可能会失败。
基于基于构造函数的依赖项注入可确保在实际使用所需代码之前必须init
所有必需的bean。
您可以通过here