1. 基于字段的注入
@RestController
public class MyController {
@Autowired
private MyService service;
}
- 优点:
- 新增依赖简单,简单明了
- 缺点:
- 可测试性差,单元测试需要spring上下文依赖,使得测试变得复杂
- 不可变性差:通过字段注入的依赖是可改变的
- 可见性差:使用字段注入,依赖在构造函数中不可见
因此,spring中不推荐使用字段注入
,建议使用构造函数注入
2. 基于Setter的注入
@RestController
public class MyController {
private MyService service;
@Autowired
public void setService(MyService service) {
this.service = service;
}
}
- 优点:
- 注入参数多的时候比较方便
- 能让类在之后重新配置或者重新注入
- 缺点:
- 有一定风险。set注入是后初始化其依赖对象,如果一个对象在没有完全初始化就被外界使用是不安全的
3. 基于构造函数注入
@RestController
public class MyController {
private final MyService service;
public MyController(MyService service) {
this.service = service;
}
}
- 优点:
- 保证注入的组件不可变
- 确保需要的依赖不为空
- 解决循环依赖的问题
- 缺点:
- 构造函数注入参数太多,会显得很笨重
构造器模式优化
@RestController
@RequiredArgsConstructor
public class MyController {
private final MyService service;
}
通过lombok的注解 @RequiredArgsConstructor,让类在编译的时候自动生成对应的含参构造函数。
@RequiredArgsConstructor 注解是针对标有 @NonNull 注解的变量和 final 变量进行参数的构造方法。