今天翻阅代码突然看到同事的一段代码,觉得非常奇怪,为什么类中的成员变量 scoreFacade 没有使用@Autowired或@Resource也可以被注入
然后我就看controller上的注解,看到最后一个@RequiredArgsConstructor时,我点进去发现是lombok的注解
lombok的注解使用的不多,对这个注解也不了解,上网搜索了解后发现这个注解原来就是可以生成带参或者不带参的构造方法。
若带参数,只能是类中所有带有 @NonNull
注解的和以final
修饰的未经初始化的字段
这么一看,就明白了为什么scoreFacade 可以被注入了。原来是通过lombok的注解生成了带参的构造方法,正好scoreFacade 是final修饰的。所以scoreFacade 就由构造器注入了。
但是,目前不明白为什么要这么写?直接加注解注入不是更简单明了吗?
为什么其他service需要使用field注入,难道就是因为觉得其他service会有多个实现的原因吗?
这里贴一下网上搜索的通过构造器注入的好处的总结
- 保证依赖不可变(final关键字)
- 保证依赖不为空(省去了我们对其检查)
- 保证返回客户端(调用)的代码的时候是完全初始化的状态
- 避免了循环依赖
- 提升了代码的可复用性
另外,当有一个依赖有多个实现的使用,推荐使用field注入或者setter注入的方式来指定注入的类型。这是spring官方博客对setter注入方式和构造器注入的比较