@Autowired在IDEA的警告

在使用spring框架时,我们使用@Autowired实现依赖注入时,IDEA经常会出现警告不建议使用字段注入,要弄懂这个警告,我们得了解@Autowired注入的方式,和他们的各自的优缺点。

image-20230223164300819

@Autowired三种用法

字段注入

字段注入是最常用的@Autowired注入方法,就是在要注入的组件上直接注解@Autowired;

1
2
3
4
5
@RestController
public class AlphaController {
@Autowired
private AlphaDao alphaDao;
}

优点:

  1. 字段注入十分简单,要修改时,修改的代码很少;

缺点:

  1. 不能使用final关键字,可能会导致空安全(空指针)问题,因为注入后的属性,只有真正使用时才能拿到。如果一开始注入的是null,可能会因为一直不调用而导致无法发现NullPointException存在;
  2. 和IoC高度耦合,无法重新设置注入的属性,无法脱离容器访问目标对象
  3. 可能导致循环依赖(A依赖B,B依赖A)

构造器注入

构造器注入是spring官方推荐的注入方法,写法就是将原来要注入的对象,在构造函数处作为参数注入;

1
2
3
4
5
6
7
8
9
@RestController
public class AlphaController {
private final AlphaDao ;

@Autowired
public AlphaController(AlphaDao alphaDao){
this.alphaDao=alphaDao;
}
}

优点:

  1. 可以使用final关键字,避免了空安全(空指针)问题。(final修饰的属性必须一开始设置属性,或者在执行构造函数建立时就赋值,保证属性不为空)
  2. 可以避免循环依赖的问题(使用构造器注入时,出现了循环依赖,启动Spring时会检测循环关系在控制台直观的表现出来)
  3. 可以明确成员变量注入的顺序

缺点:

  1. 当要注入的依赖特别多时,构造器会变得特别臃肿
  2. 要增删依赖注入时,比较麻烦(要同时修改成员变量和构造函数)

set方法注入

setter方法注入通过set方法来注入依赖,经常用于依赖选择性注入

1
2
3
4
5
6
7
8
@RestController
public class AlphaController {
private AlphaDao alphaDao;
@Autowired
public void SetAlphaDao(AlphaDao alphaDao){
this.alphaDao=alphaDao;
}
}

优点:

  1. 可以在类构造后,重新注入依赖
  2. 可以选择性注入(只有设置了setter方法的属性会被注入
  3. 十分灵活,容易编写代码

缺点:

  1. 可能会导致循环依赖(spring不检测set注入的循环关系
  2. 不能使用final,可能会导致空安全