spring最大的特点就是控制反转,以前我们使用另一个类的方法时,总是需要先new一个类的实例,这样既占用内存也不方便管理,spring就提出bean容器的概念,把所有需要用到的实例都统一交给bean管理,当需要一个类的实例时,由spring注入。

1.问题来源

在使用@Autowired方法注入的时候提示Field injection is not recommended,截图如下

下列哪个不是springmvc的组件 以下哪种不是spring注入方式_构造器


字面意思就是使用这种变量的依赖注入不被推荐

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 ”