在使用IDEA 进行Spring 开发的时候,在字段上面使用@Autowired注解的时候,IDEA 会有警告提示:
文章插图
翻译过来就是这个意思:不建议使用基于 field 的注入方式 。
Spring 开发团队建议:在Spring Bean 永远使用基于constructor 的方式进行依赖注入 。对于必须的依赖,永远使用断言来确认 。
为什么Spring 团队会提出这样的建议?直接使用这种基于 field 的注入方式有什么问题?
首先需要知道,Spring 中有这么3种依赖注入的方式 :
- 基于 field 注入(属性注入)
- 基于 setter 注入
- 基于 constructor 注入(构造器注入)
@Autowiredprivate Svc svc;
2. 基于 setter 方法注入通过对应变量的setXXX()方法以及在方法上面使用注解,来完成依赖注入 。比如:private Helper helper;@Autowiredpublic void setHelper(Helper helper) {this.helper = helper;}
注:在 Spring 4.3 及以后的版本中,setter 上面的 @Autowired 注解是可以不写的 。3. 基于 constructor 注入将各个必需的依赖全部放在带有注解构造方法的参数中,并在构造方法中完成对应变量的初始化,这种方式,就是基于构造方法的注入,也是日常最为推荐的一种使用方式 。这种注入方式很直接,通过对象构建的时候建立关系,所以这种方式对对象创建的顺序会有要求,当然Spring会搞定这样的先后顺序,除非出现循环依赖,然后就会抛出异常 。比如:
private final Svc svc;@Autowiredpublic HelpService(@Qualifier("svcB") Svc svc) {this.svc = svc;}
在 Spring 4.3 及以后的版本中,如果这个类只有一个构造方法,那么这个构造方法上面也可以不写 @Autowired 注解 。Spring 开发团队的建议
- 强制依赖就用构造器方式
- 可选、可变的依赖就用setter 注入当然可以在同一个类中使用这两种方法 。构造器注入更适合强制性的注入旨在不变性,Setter注入更适合可变性的注入 。
基于 setter 的注入,则只应该被用于注入非必需的依赖,同时在类中应该对这个依赖提供一个合理的默认值 。如果使用 setter 注入必需的依赖,那么将会有过多的 null 检查充斥在代码中 。使用 setter 注入的一个优点是,这个依赖可以很方便的被改变或者重新注入。
推荐阅读
- 下一代Java微服务:从Spring Boot到Quarkus的迁移指南
- 为什么说35岁是程序员的分水岭
- 为什么只有抖音还在制造头部主播
- 我为什么喜欢钓鱼,这五个理由,让人不得不爱
- 网管的工资那么低,为什么有那么多漂亮女孩愿意做?看完才晓得
- 继王诗龄后,多多和天天也出国了,为什么星二代集体“出逃”?
- 40岁胡歌疑患抑郁症!自称对不起很多人,黑料被扒,网友建议退圈
- 穷忙!为什么我们总容易陷入“越忙越穷”的怪圈?
- 为什么藏族朋友手中的念珠都能盘出极品包浆?
- 减肥适合吃的7种主食,玉米排在第6,第一个建议常吃,不妨了解