@RequiredArgsConstructor注解的详解

原理底层

Lombok 库底层使用了 Java Agent 技术和 ASM 字节码库。当 Lombok 与 IDE 集成时(例如 IntelliJ IDEA, Eclipse, NetBeans 等),它会在编译的前置阶段处理包含 Lombok 注解的代码,生成对应的代码段。这个处理过程是通过在编译器插件或 JVM 代理中注入代码实现的。

当你的源代码被编译时,Lombok 会拦截编译器的过程,扫描所有使用了 Lombok 注解的类文件。一旦发现 @RequiredArgsConstructor 注解,Lombok 就根据注解的要求,使用 ASM 创建并插入适当的无参构造函数代码。这样,当你的类文件被编译时,就已经包含了自动生成的构造函数。

详细说明

  1. 功能
    • @RequiredArgsConstructor 会为类生成一个构造函数,这个构造函数包含所有被标记为 final 的成员变量以及用 @NonNull 注解标记的成员变量。
    • 这样,使用这个注解可以避免手动编写构造函数,从而减少代码量。

@RequiredArgsConstructor 是 Lombok 提供的一个注解,用于自动生成一个包含所有 final 成员变量的构造函数。Lombok 是一个 Java 库,通过注解来简化 Java 代码的编写,减少样板代码(boilerplate code)。

  1. 使用示例

    import lombok.RequiredArgsConstructor;
    
    @RequiredArgsConstructor
    public class Person {
        private final String name;
        private final int age;
    }
    

    上述代码生成的构造函数类似于:

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }
    
  2. 为什么要使用

    • 减少样板代码:自动生成构造函数可以减少手动编写构造函数的工作量,使代码更加简洁。
    • 提高可维护性:通过减少样板代码,代码的可读性和可维护性都会得到提升。
    • 确保不变性:对于不可变对象(immutable objects),final 成员变量通常用来确保对象状态的一致性和不变性,@RequiredArgsConstructor 可以自动确保这些变量在对象创建时被初始化。

使用 @RequiredArgsConstructor 注解时,对象的依赖注入发生在以下阶段:

1. Bean 创建过程

在Spring中,当Spring容器创建Bean实例时,以下过程会触发依赖注入:

启动阶段:当Spring容器启动并初始化时,容器会扫描所有被管理的类,包括带有 @Component、@Service、@Repository 或 @Controller 注解的类。

扫描和解析:容器会识别 @RequiredArgsConstructor 注解并为该类生成一个构造函数。这个构造函数会包含所有 final 或带有 @NonNull 注解的字段作为参数。

2. 构造器调用

依赖解析:当需要创建这个Bean实例时,Spring会自动解析那些依赖的Bean。例如,如果一个类有两个依赖,Spring会通过容器中已有的Bean实例找到这两个依赖。

执行构造函数:Spring容器会调用由 @RequiredArgsConstructor 生成的构造函数,将解析到的依赖以参数的形式传入构造函数。

3. 对象完全构建

完成实例化:一旦构造函数执行完成,Bean对象就被完全创建,并可以使用,这时候所有必需的依赖关系也已经注入。
示例

import lombok.RequiredArgsConstructor;  
import org.springframework.stereotype.Service;  

@Service  
@RequiredArgsConstructor  
public class MyService {  
    private final MyRepository myRepository; // 依赖项  

    public void doSomething() {  
        myRepository.performAction();  
    }  
}  

在这个例子中,MyService 类的构造函数会在Spring创建 MyService Bean时被调用,myRepository 会被自动注入。

总结
使用 @RequiredArgsConstructor 时,依赖注入发生在Spring创建Bean的阶段,通过自动生成的构造函数在对象实例化时完成。这种方式在确保对象在使用前已经具备所需的依赖关系的同时,也增强了代码的可读性和可维护性。

相关注解

  • @NoArgsConstructor:生成无参构造函数。
  • @AllArgsConstructor:生成包含所有成员变量的构造函数。
  • @Builder:生成一个构建器模式的实现,提供更灵活的对象创建方式。

通过使用 Lombok 的注解,开发者可以减少冗余代码,提高开发效率。不过,请确保你的项目中已经引入了 Lombok 依赖,并且 IDE 或构建工具配置正确,以便支持 Lombok 的注解处理。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值