在使用@Autowired出现Field injection is not recommended警告,使用变量依赖注入的方式是不被推荐的。
依赖注入框架的核心思想之一就是受容器管理的类不应该去依赖容器所使用的依赖。换句话说,这个类应该是一个简单的POJO(Plain Ordinary Java Object)能够被单独实例化并且你也能为它提供它所需的依赖。只有这样,你才能在单元测试中实例化这个类而不必去启动依赖注入容器,实现测试分离(启动容器更多是集成测试)。
依赖注入主要有3种方式:
1. 变量注入:
@Autowired
public SysRoleService sysRoleService;
2.构造器注入:
private SysLogService sysLogService;
private SysRoleService sysRoleService;
@Autowired
public SysService(SysRoleService sysRoleService,SysLogService sysLogService) {
= sysRoleService;
= sysLogService;
}
注入:
public SysRoleService sysRoleService;
@Autowired
public void setSysRoleService(SysRoleService sysRoleService) {
= sysRoleService;
}
变量注入:
优点:代码非常简洁,可以无限扩展。
缺点:不能有效的指明依赖,容易出现空指针异常。
Setter方式:
优点:选择注入,即使没有注入这个依赖,那么也不会影响整个类的运行。
构造器方式:
优点:通过强制指明依赖注入来保证这个类的运行,类不再对依赖负责。
缺点:构造器参数的数量就会变得太多以至于很容易出现错误。
所以应该尽量避免变量方式注入,使用setter方式注入或者构造器注入,这个类是强制依赖的话就用构造器方式,选择依赖的话就用setter方法注入。