在平时基于Spring的开发中,最常用的注入方式就是利用@Autowired
、@Resource
进行field注入,但是Spring官方推荐的注入方式是构造器注入,本文记录一下使用构造器注入的方式及带来的益处。
1 使用方式
@Controller
public class UserController {
private final UserService userService;
@Autowired
public UserController(UserService userService) {
this.userService = userService;
}
}
2 益处
2.1 保证依赖不可变
注入对象声明为final,保证不可变
2.2 保证依赖不为空
不用担心程序启动正常,但是使用过程中因注入对象为空而导致的异常。无法注入时会在启动阶段就直接暴露。
2.3 循环依赖
很多说法是通过构造器注入的方式能够避免循环依赖,但是我对这种说法不甚赞同。循环依赖并不是缺陷,而是一种特殊的依赖形式,所以“避免循环依赖”在我看来并不能被称为是优点。
Spring通过三级缓存的方式直接在让用户无感的前提下,解决了setter注入以及filed注入方式下的循环依赖,但是并没有直接处理构造器注入这种方式,我们可以通过@Lazy
注解让构造器方式兼容循环依赖。
2.4 提升了代码的可复用性
非IOC容器环境可使用new实例化该类的对象