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注解来自动生成带@Autowired的构造器。而引用中展示了@Autowired注解的使用,示例代码中通过@Autowired注解将UserService注入到CameraService中。另外,引用中提到了@Autowired注解的三种注入方式,包括构造器注入、setter注入和属性注入构造器注入可以使用lombok的@RequiredArgsConstructor注解生成带@Autowired的构造器,setter注入可以通过setter方法将依赖注入,属性注入可以直接通过@Autowired注解注入属性。所以,@RequiredArgsConstructor和@Autowired注解可以结合使用,通过@RequiredArgsConstructor生成带@Autowired的构造器来实现依赖注入。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [@Autowired三种注入方式的区别以及@Inject注解的基本使用](https://blog.csdn.net/m0_63323097/article/details/130463814)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* [2021-10-09 Lombok @RequiredArgsConstructor 注解](https://blog.csdn.net/weixin_44092667/article/details/120665426)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值