1. 问题起因
在完成Spring Boot的项目时,每次使用@AutoWired太麻烦了,如果一次忘记写,就容易出现null状态,甚至有时候写了仍然会出现null状态。有没有什么办法实现自动注入呢?
2. 解决办法
Springboot官方建议使用final来修饰成员变量,然后通过构造方法来进行注入。
原因:final修饰的成员变量是不能够被修改的,反射那就没办法在修改了。
spring代替 @Autowired(lombok相关注解) (前提:使用lombok)
@Service
//生成一个包含过所有字段的构造方法
//@AllArgsConstructor
//会将类的每一个final字段或者non-null字段生成一个构造方法
@RequiredArgsConstructor
public class DashboardServiceImpl implements DashboardService {
/* autowired没什么问题,但是有可能报错,iUserService为null,spring也不建议使用autowired */
//@Autowired
//private IUserService iUserService;
private final UserRepository userRepository;
private final CallRepository callRepository;
@PostMapping("/dashboard")
public Result getAllPanelData() {
//....
}
}
注意:
- @NoArgsConstructor后会 生成无参的构造方法
- @RequiredArgsConstructor会将类的每一个final字段或者non-null字段生成一个构造方法
- @AllArgsConstructor 生成一个包含过所有字段的构造方法。
在查找资料时,碰到其他人说不能用@AllArgsConstructor 注解,原因是使用@AllArgsConstructor后,@Value会失效,获取不到值。
所以以后在使用时,注意需要替代@Autowired但不需要所有字段全部装配时(部分需要手动修改或者懒赋值)最优雅的方案是使用@RequiredArgsConstructor配合final关键字。
评论区