原理底层
Lombok 库底层使用了 Java Agent 技术和 ASM 字节码库。当 Lombok 与 IDE 集成时(例如 IntelliJ IDEA, Eclipse, NetBeans 等),它会在编译的前置阶段处理包含 Lombok 注解的代码,生成对应的代码段。这个处理过程是通过在编译器插件或 JVM 代理中注入代码实现的。
当你的源代码被编译时,Lombok 会拦截编译器的过程,扫描所有使用了 Lombok 注解的类文件。一旦发现 @RequiredArgsConstructor
注解,Lombok 就根据注解的要求,使用 ASM 创建并插入适当的无参构造函数代码。这样,当你的类文件被编译时,就已经包含了自动生成的构造函数。
详细说明
- 功能:
@RequiredArgsConstructor
会为类生成一个构造函数,这个构造函数包含所有被标记为final
的成员变量以及用@NonNull
注解标记的成员变量。- 这样,使用这个注解可以避免手动编写构造函数,从而减少代码量。
@RequiredArgsConstructor
是 Lombok 提供的一个注解,用于自动生成一个包含所有 final
成员变量的构造函数。Lombok 是一个 Java 库,通过注解来简化 Java 代码的编写,减少样板代码(boilerplate code)。
-
使用示例:
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; }
-
为什么要使用:
- 减少样板代码:自动生成构造函数可以减少手动编写构造函数的工作量,使代码更加简洁。
- 提高可维护性:通过减少样板代码,代码的可读性和可维护性都会得到提升。
- 确保不变性:对于不可变对象(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 的注解处理。