spring最大的特点就是控制反转,以前我们使用另一个类的方法时,总是需要先new一个类的实例,这样既占用内存也不方便管理,spring就提出bean容器的概念,把所有需要用到的实例都统一交给bean管理,当需要一个类的实例时,由spring注入。
1.问题来源
在使用@Autowired方法注入的时候提示Field injection is not recommended,截图如下
字面意思就是使用这种变量的依赖注入不被推荐
2.常用的几种注入方式
2.1自动装配
这是我们最常用的注入方式,因为其使用起来非常简单,只需加上@Autowired注解即可。
代码:
@Autowired
private BestPayService bestPayService;
这是我们最喜欢用的方式,只有两行代码,非常简单。为什么spring不推荐这样的方式呢,因为这种方式过于依赖注入容器,当没有启动整个依赖容器的时候,这个类有可能没有被spring托管,在反射的时候没有办法提供这个类的依赖。影响整体的项目运行。但我们在做项目时,大概率都是在项目启动的时候就把所有的类交给bean容器了。
2.2Set方法注入
代码:
public class SpringAction {
//创建成员变量
private SpringDao springDao;
//一定要写被注入对象的set方法
public void setSpringDao(SpringDao springDao) {
this.springDao = springDao;
}
}
这种方式只有在需要实例化这个类的时候才会取加载,而不是在程序初始化的时候就注入。但是这种方式我们不能将构造器设置为final类型。
2.3构造器注入
代码:
private SpringDao springDao;
private final InventoryMapper inventoryMapper;
public SpringAction(SpringDao springDao) {
this.SpringDao = SpringDao;
}
基于构造器的方式是java推荐的,就是代码量会比较多,并且注入的顺序会按照后面的变量顺序来注入,bean之间最好不要有循环依赖。
3.总结
当我们必须对变量加上final时,使用构造函数注入,可选或多变的依赖使用setter注入,其实在大多数的情况下避免变量注入。如果想让标题中的报警Field injection is not recommended不显示的话,我们可以如下操作Settings->Editor->Inspections->Spring->Spring Core->Core->Field Injection warning将Severity属性值改为 “ No highlighting,only fix ”