spring注入方式
在代码开发中,是否老是被spring提示的,请使用构造器注入感到困惑和烦躁,为什么要使用构造器注入,而不能使用field注入or Setter注入呢
The Spring team generally advocates constructor injection as it enables one to implement application components asimmutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state. As a side note, a large number of constructor arguments is a bad code smell, implying that the class likely has too many responsibilities and should be refactored to better address proper separation of concerns. ——–BY Spring
倡导构造器注入,因为它使得实现应用组件是作为一个不可变的对象,同时确保它所依赖的项目资源不是null的,此外构造器注入永远是返回调用者一个完全初始化的状态。温馨提示:庞大的构造器入参是坏味道代码,表明这个类有太多的职责,应该以更好的设计模式进行重构
field注入
// 这样子做确实挺简洁明了的,但是容易NPE,因为field injection在不调用时,没办法初始化,而当初始化往往都晚了
public class XXXService{
@Autowired
private XXXRepository repository;
public void test(){
repository.addSql();
}
}
优点 | 对比 | 缺点 |
---|---|---|
较为直观,清晰明了 | 相比构造器会出现NPE,循环依赖的情况,当不调用时也无法发现NPE的情况 | 其实主要也就是对比的内容了 |
构造器注入
现在强推的注入模式
@Autowired
public constructor(XXXService xxxService){
this.xxx=xxxService;
}
优点 | 缺点 |
---|---|
能做NPE检查,同时因为是构造器,所以避免了field注入时,需要用到才会初始化的情况 | 当变量巨多时会导致注入很臃肿,同时如果需要制定类注入时,这个方法不是那么好用了 |
主要是在初始化时想比setter注入,在类加载实例化时,一定能校验注入的内容不为空,更为安全 |
setter注入
旧一代spring推荐内容
优点 | 缺点 |
---|---|
避免构造器臃肿庞大,同时可以使得类在之后配置或者重新注入,也能指定注入 |