我们在代码中是否出现过这样的提示?
【译文:不建议字段注入】
那我不接受建议可以吗?当然可以。
分析一下为啥不推荐字段注入
其实网上总结得也比较多,我这里就随便讲讲我的理解,欢迎各位大佬在评论区补充。
- 注入字段值可变。
- 有可能为空。
- 可能出现循环依赖。
然后解释一下:
-
可变:
既然不能用final修饰,那么就一定有可能在代码中换成另外一个。 -
有可能为空:
之前遇到过一个情况,在业务调用的时候将对象new出来进行调用了。这个时候字段并没有被赋值上,是null。这导致在具体调用方法时出现了空指针。 -
可能出现循环依赖。
spring可以帮我们解决一部分循环依赖问题,但是像这种,@Async修饰的方法 spring会为其生成一个代理类,这个时候发现有循环依赖问题就会被抛出。
你想想,你写着代码唱着歌,写了一个异步方法,突然项目就启动失败了!
既然不推荐字段注入,推荐怎样注入呢?
答案是:构造注入
其他的就不能用了吗?:
存在即是合理的,你去google一下把警告给去掉,其实不去掉也不影响你使用。
比较一下三种注入方式的特点:
构造注入:不可变,不为空,循环依赖了就报错–强依赖。(类方法工作一定要用,那就用构造注入)
setter注入:可选,可变。(作为可选项依赖,有没有值反正不影响方法工作,我用得比较少)
filed注入:精短,可读性高。
构造注入配合Lombok的@RequiredArgsConstructor使用还是很方便的。
@RequiredArgsConstructor
@Service
public class TestServiceImpl {
private final AService aService;
private final BService bService;
}
构造注入不会出现循环依赖问题。
如果依赖项太多,构造不规范了,这个时候应该考虑是否违背了接口单一职责原则。