探索 Lombok自动注入注解 之 @RequiredArgsConstructor :原理、实践、踩坑及填坑

文章目录

  • 一、什么是@RequiredArgsConstructor?
  • 二、@RequiredArgsConstructor的使用方式
    • 1、引入依赖
    • 2、代码示例
      • 2.1、常规 @Autowired注入:
      • 2.2、常规 @Autowired注入:
      • 2.3、lombok中的**RequiredArgsConstructor注入:
  • 三、@RequiredArgsConstructor的实现原理
  • 四、@RequiredArgsConstructor 在使用中遇到的几个问题
    • 1、循环依赖问题
    • 2、@Qualifier失效问题
  • 五、小结

一、什么是@RequiredArgsConstructor?

注解@RequiredArgsConstructor 是 Lombok 提供的一个注解,其主要作用在于简化 @Autowired 的书写过程。在编写 Controller 层或 Service 层代码时,常常需要注入众多的 mapper 接口或 service 接口。若每个接口都使用 @Autowired 进行标注,代码会显得繁琐。而 @RequiredArgsConstructor 注解能够替代 @Autowired 注解,但需注意,在类上添加 @RequiredArgsConstructor 时,需要注入的类必须使用 final 进行声明。

二、@RequiredArgsConstructor的使用方式

1、引入依赖

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
</dependency>

2、代码示例

2.1、常规 @Autowired注入:

/**
 * @author fhey
 */
@RestController
@RequestMapping("/user")
public class UserController {
   
   

    @Autowired
    private UserService userService;

    @GetMapping("/getUser")
    public User getUser(){
   
   
        User user = userService.getUser("1");
        return user;
    }
}

2.2、常规 @Autowired注入:

/**
 * @author fhey
 */
@RestController
@RequestMapping("/user")
public class UserController {
   
   

    private UserService userService;
    
    public void setUserService(UserService userService) {
   
   
        this.userService = userService;
    }

    @GetMapping("/getUser")
    public User getUser(){
   
   
        User user = userService.getUser("1");
        return user;
    }
}

2.3、lombok中的**RequiredArgsConstructor注入:

/**
 * @author fhey
 */
@RestController
@RequestMapping("/user")
@RequiredArgsConstructor
public class UserController {
   
   

    private final UserService userService;

    @GetMapping("/getUser")
    public User getUser(){
   
   
        User user = userService.getUser("1");
        return user;
    }
}

可以看到,使用 @RequiredArgsConstructor 省去了 @Autowired@Resource 注解。

三、@RequiredArgsConstructor的实现原理

您是否好奇 @RequiredArgsConstructor 是如何运作的?让我们深入探究一番!

​ 在编译阶段,Lombok 借助“AST transformation”(抽象语法树转换)这一技术来修改 Java 源代码。这是一种在编译期间处理源代码的手段,它不会对运行时的性能造成影响,却能在生成的字节码中留下 Lombok 的运作痕迹。

​ 当在类上使用 @RequiredArgsConstructor 注解时,Lombok 会对类中的所有 final 字段进行观察,并在编译期间生成相应的构造函数。这个生成的构造函数会将这些 final 字段作为参数,并在构造函数内部完成这些字段的初始化。

​ 大致的实现步骤如下:

  1. 收集所有的 final 字段。

  2. 生成一个包含这些 final 字段作为参数的构造函数。

  3. 在构造函数内,将参数的值赋给对应的字段。

以下是一个示意代码(需注意,这只是为了演示,实际实现要复杂得多):

import java.lang.reflect.Field;

public class LombokMagic {
   
   
    public static <T> void createRequiredArgsConstructor(T
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

知北游z

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值