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

Lombok 注解简介

lombok @Builder踩坑系列 - 构造方法和默认值问题

lombok

Lombok-@Data

01-在实体类上加了lombok的@Data注解