为什么这个成员变量不用@Autowired也可以被注入?

今天翻阅代码突然看到同事的一段代码,觉得非常奇怪,为什么类中的成员变量 scoreFacade 没有使用@Autowired或@Resource也可以被注入

然后我就看controller上的注解,看到最后一个@RequiredArgsConstructor时,我点进去发现是lombok的注解

lombok的注解使用的不多,对这个注解也不了解,上网搜索了解后发现这个注解原来就是可以生成带参或者不带参的构造方法。

若带参数,只能是类中所有带有 @NonNull注解的和以final修饰的未经初始化的字段

这么一看,就明白了为什么scoreFacade 可以被注入了。原来是通过lombok的注解生成了带参的构造方法,正好scoreFacade 是final修饰的。所以scoreFacade 就由构造器注入了。

但是,目前不明白为什么要这么写?直接加注解注入不是更简单明了吗?

为什么其他service需要使用field注入,难道就是因为觉得其他service会有多个实现的原因吗?

 

这里贴一下网上搜索的通过构造器注入的好处的总结

  1. 保证依赖不可变(final关键字)
  2. 保证依赖不为空(省去了我们对其检查)
  3. 保证返回客户端(调用)的代码的时候是完全初始化的状态
  4. 避免了循环依赖
  5. 提升了代码的可复用性

另外,当有一个依赖有多个实现的使用,推荐使用field注入或者setter注入的方式来指定注入的类型。这是spring官方博客对setter注入方式和构造器注入的比较

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值