文章目录
- 一、什么是@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 字段作为参数,并在构造函数内部完成这些字段的初始化。
大致的实现步骤如下:
-
收集所有的
final字段。 -
生成一个包含这些
final字段作为参数的构造函数。 -
在构造函数内,将参数的值赋给对应的字段。
以下是一个示意代码(需注意,这只是为了演示,实际实现要复杂得多):
import java.lang.reflect.Field;
public class LombokMagic {
public static <T> void createRequiredArgsConstructor(T

最低0.47元/天 解锁文章
1996

被折叠的 条评论
为什么被折叠?



