Lombok注解:构造器注入:@RequiredArgsConstructor
Posted ABin-阿斌
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Lombok注解:构造器注入:@RequiredArgsConstructor相关的知识,希望对你有一定的参考价值。
我是 ABin-阿斌:写一生代码,创一世佳话,筑一览芳华。 如果小伙伴们觉得我的文章不错,记得一键三连,感谢~
文章目录
前言
- Spring 依赖注入方式主要有2种:
- 第一种是: 通过 @Autowire、@Resource 等注解注入
- 第二种是: 通过构造器的方式进行依赖注入,我们只要配合 Lombok 给的注解就可以进行完美注入,这种方法也更加的简介与优雅,同时也是 Spring 官网推荐的注入方式。
一、为什么推荐使用:构造器注入方式
- 我们在开发过程中可以看到会发现,当我们使用 @Autowired 注解进行注入时,下面会有一个波浪线的提示,我们鼠标移至下面就可以看到相关提示信息了, Spring 并不推荐使用。
- 原因: 注入失败的话不会报错提示,容易出现空指针
二、Spring官方推荐
- 我们通过百度或者查看 Spring 官方原文,我们可以看到 Spring 其实更推荐我们使用:构造器注入的方式
1、构造器注入
注意细节:
- 这里所有字段必须都是 final,若不使用 final,用 @NotNull 注解也是可以的,不过还是建议使用 final
- onConstructor = @__(@Lazy):加上这个参数加载的时候会快一些
2、setter注入
@Slf4j
@RestController
@RequestMapping("vpn")
public class VpnController
private final IkeInfo ike;
private final IpSecInfo ipSec;
@Autowired
public void setIkeInfo (PointBiz1 ike)
this.ike= ike;
@Autowired
public void setIpSecInfo (IpSecInfo ipSec)
this.ipSec= ipSec;
...
3、构造器注入和Setter注入的区别
- 构造器对注入强制性的的依赖是好的。对象需要这些依赖才能正常运转,通过构造器提供这些依赖就能保证对象初始化后就能被使用。使用构造器注入的一个可能的影响就是循环依赖。
- Setter 应该被用来注入可变的依赖。当没有提供依赖时,这个类也应该能够运转。当实例化对象后,这些依赖也能随时改变。其实也视情况而变,有时,一个不变的对象是理想状态。有时,最好是能在运行期间改变对象的属性。
总结
- Field 注入应该尽可能地去避免使用。作为替代,你应该使用构构造器注入或 Setter 注入。
- 他们都有利有弊,需要视情况而定。当然你可以在同一个类中使用这两种方法。
- 构造器注入更适合强制性的注入旨在不变性,Setter 注入更适合可变性的注入。
1、Autowired的多种方式
-
构造器注解(constructor)
-
属性 setter 注解
-
field 注解
-
不管使用上面3中的哪个方法,Spring 都会满足声明的依赖。假如有且只有一个 bean 匹配依赖的话,那么这个 bean 将会被装配进来。如果使用2,3方式注解,有多个 bean 的话,则用 Qualifier 指定。
public class MemberService
@Autowired
@Qualifier(name="userDao")
private UserDao userDao;
- 如果没有匹配的 bean,那么在应用上下文创建的时候,Spring 会抛出一个异常。为了避免异常的出现,可以使用
@Autowired(required = false)
private IMediaPlayer CDPlayer;
-
required=false表示: 如果没有匹配的话,Spring 会让 bean 处于未装配的样子。
-
使用未装配的属性,会出现 NullPointerException
-
@Resource 注解,如果同时指定了 name 和 type,则从Spring 上下文中找到唯一匹配的 bean 进行装配,找不到则抛出异常。
public class UserService
@Resource
private UserDao userDao;
@Resource(name="studentDao")
private StudentDao studentDao;
@Resource(type="TeacherDao")
private TeacherDao teacherDao;
@Resource(name="manDao",type="ManDao")
private ManDao manDao;
二、参考文章:
- 原文: https://www.vojtechruzicka.com/field-dependency-injection-considered-harmful/
- 翻译: https://blog.csdn.net/github_38222176/article/details/79506392
- 关于SpringBean的详细讲解看这篇: https://blog.csdn.net/weixin_43277643/article/details/84253237
以上是关于Lombok注解:构造器注入:@RequiredArgsConstructor的主要内容,如果未能解决你的问题,请参考以下文章
Intellij安装lombok插件,解决注解@Slf4j注入后找不到变量log