不灭的焱

革命尚未成功,同志仍须努力下载JDK17

作者:Albert.Wen  添加时间:2021-05-25 10:10:56  修改时间:2024-04-09 23:34:04  分类:Java框架/系统  编辑

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个参数,明显有点蠢。但是如果使用属性注入的话就没有这样的限制。但是一个类有很多的依赖,是一个危险的标志,因为很有可能这个类完成了超过一件事,违背了单一职责原则。

 

 

参考:

  1. Field injection is not recommended
  2. 使用@Autowired注解警告Field injection is not recommended
  3. @Autowired警告:Field injection is not recommended
  4. Field Dependency Injection Considered Harmful