Field injection is not recommended(不建议使用字段注入 ) Inspection info: Spring Team recommends: “Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies”. (Spring Team建议:“始终在bean中使用基于构造函数的依赖项注入。总是对强制依赖项使用断言”。)

🍟Spring官方文档

文档中也是用的构造注入没有直接使用 @Autowired publicclassMovieRecommender{privatefinal CustomerPreferenceDao customerPreferenceDao;@AutowiredpublicMovieRecommender(CustomerPreferenceDao customerPreferenceDao){
this.customerPreferenceDao = customerPreferenceDao;
}// …
}

注入产生的风险跟处理

极客时间 每日一课中大佬讲mock单元测试时说的 主要问题是无法高效进行单元测试,@Autowired 会加大测试难度

风险

根据idea的提示可知:

  • 字段注入会导致类严重依赖于 Spring 框架

如果你将所有 Spring 相关的注解,比如 @Service、@Autowired 全部去掉,你会发现,失去 Spring 支持的 UserService 有一个严重的问题!
那就是没有任何办法对它的 private 字段赋值,也就是说它们会一直为 Null。
唯一能够赋值的方式是使用反射,在使用 Mock 框架时,需要使用反射将假对象赋值给 UserService 的 private 字段,增加了测试的难度,降低了类的可测试性。

处理

使用构造方式注入

如果使用构造函数注入,就不会有这个问题。可以通过构造函数将 Mock 对象传递给真实对象。使用构造函数注入的 UserService,即便将所有 Spring 注解都去掉,它依然是一个正确的 POJO 类,可以独立工作。它没有和 Spring 强耦合,只是 Spring 框架帮我们调用了它的构造函数,并传入了正确的参数。