Spring官方推荐使用构造函数注入,不仅因为这种情况下可以用final关键字修改成员属性,更重要的是可以避免循环依赖。如果存在循环依赖,Spring项目启动时会报错。
public class SysUserController extends BaseController {
private final ISysUserService userService;
private final ISysRoleService roleService;
public SysUserController(ISysUserService userService, ISysRoleService roleService) {
this.userService = userService;
this.roleService = roleService;
}
}
|
属性注入装配
public class SysUserController extends BaseController {
@Autowired
private ISysUserService userService;
@Resource
private ISysRoleService roleService;
}
|
@Autowired默认按类型装配,而@Resource默认按名称装配。当没有找到与名字匹配的bean时,它将被按类型装配。
而@Qualifier和@Autowired一起用来指定Bean的名字,它也可以通过名字来组装。
在IDEA中直接在变量上使用@Autowired会发现一个警告提示。不建议进行字段注入。
原因是官方建议我们使用构造函数注入的方法,这种方法有明显的缺点,比如:注入对象不能用final来修改,而且不能发现NullPointException的存在。
Setter注入装配
public class SysUserController extends BaseController {
private ISysUserService userService;
@Autowired
public void setUserService(ISysUserService userService) {
this.userService = userService;
}
}
|
需要注意的是,在使用Setter注入时,需要添加@Autowired或@Resource注解,否则注入不能成功。
此外,需要注意的是,无论是属性注入还是Setter注入的变量都不能用final关键字来修改。
@RequiredArgsConstructor
不要使用@Autowired, @Resource ,推荐使用@Requiredargsconstructor
在谈完Spring的三个依赖注入后,让我们了解一下Lombok的@RequiredArgsConstructor注解。
在Lombok中,有三个注解用于生成构造方法,即@NoArgsConstructor、@RequiredArgsConstructor、@AllArgsConstructor。我们在这里只介绍@RequiredArgsConstructor。
@Controller
@RequiredArgsConstructor
public class SysUserController extends BaseController {
private final ISysUserService userService;
private ISysRoleService roleService;
//----------------------------
}
|
使用@RequiredArgsConstructor将为我们生成一个私有的构造函数,其中包含用final关键字装饰的常量和变量。
然后我们就可以直接通过构造函数完成注入,而不需要使用属性注入(@Autowired和@Resource),这不仅节省和简化了大量的代码,而且还解决了属性注入可能出现的空指针问题。