Idea开发过程中,注入服务时,提示:Field injection is not recommended,错误如下图:
解决办法
原代码:
@Service public class DmDataTableService extends AbstractService<DmDataTableMapper, DmDataTable, String> { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired private DmApprovalInfoService approvalInfoService; }
修改后代码:
@Service public class DmDataTableService extends AbstractService<DmDataTableMapper, DmDataTable, String> { private Logger logger = LoggerFactory.getLogger(getClass()); private DmApprovalInfoService approvalInfoService; @Autowired public void setDependencyB(DmApprovalInfoService approvalInfoService) { this.approvalInfoService = approvalInfoService; } }
问题原因:依赖注入的方式不推荐使用属性注入的方式,改为setter方法注入即可。
原因分析
那么为什么不推荐Field Injection呢?
通常依赖注入方式有三种:
- 构造方法注入
为了强制依赖,或者为了易变性,使用构造方法注入;
- setter方法注入
为了可选的或者可变的依赖,使用setter注入;
- 属性注入
通过反射直接注入到fields,@Autowired就是通过这种方式,应尽量避免使用直接在属性上注入。
属性注入的坏处
1.你不能使用属性注入的方式构建不可变对象;
2.你的类和依赖容器强耦合,不能在容器外使用;
3.你的类不能绕过反射(例如单元测试的时候)进行实例化,必须通过依赖容器才能实例化;
4.实际的依赖被隐藏在外面,不是在构造方法或者其它方法里面反射的;
5.一个类经常会有超过10个的依赖。如果使用构造方法的方式注入的话,构造方法会有10个参数,明显有点蠢。但是如果使用属性注入的话就没有这样的限制。但是一个类有很多的依赖,是一个危险的标志,因为很有可能这个类完成了超过一件事,违背了单一职责原则。
参考:
- Field injection is not recommended
- 使用@Autowired注解警告Field injection is not recommended
- @Autowired警告:Field injection is not recommended
- Field Dependency Injection Considered Harmful