java - 如何将参数传递给使用 @RequiredArgsConstructor 的类的构造函数?
问题描述
我正在尝试通过构造函数drMessage实例化一个传递参数的类,我正在使用 @RequiredArgsConstructor 注释,以及使用 @Autowired 的一些依赖注入,如下所示,问题是当使用 @RequiredArgsConstructor 注释时,它在内部实现了默认构造函数,并且我尝试手动构建构造函数,但IDE告诉我这些构造函数的变量尚未初始化,我该如何解决?谢谢
@RequiredArgsConstructor
@Service
public class ServiceImpl implements IService {
@Autowired
private final DtoMapper dtoMapper;
@Autowired
private final CDtoMapper cDtoMapper;
private DrMessage drMessage;
**other sentences**
}
解决方案
Lombok 在编译时工作,而 Spring 在运行时工作。因此,当您在您的类(它可以是常规的 java 类、spring bean 等)上放置构造函数的 Lombok 注释(@AllArgsConstructor
、@RequiredArgsConstructor
等)时,Lombok 会为您创建一个构造函数。在这种情况下,它将为所有最终字段创建一个构造函数(请参阅文档
如您所见,lombok 没有考虑@Autowired
注释,由于您没有放置@NonNull
注释drMessage
(检查文档),因此不会为其生成构造函数参数,因此您的类将如下所示:
@RequiredArgsConstructor
@Service
public class ServiceImpl implements IService {
@Autowired
private final DtoMapper dtoMapper;
@Autowired
private final CDtoMapper cDtoMapper;
private DrMessage drMessage;
public ServiceImpl(DtoMapper dtoMapper, cDtoMapper cDtoMapper) {
this.dtoMapper = dtoMapper;
this.cDtoMapper = cDtoMapper;
}
**other sentences**
}
因此,如果您希望 lombok 生成参数以DrMessage
使其成为最终参数,或者在其上添加@NonNull
注释。
至此,Lombok 的工作就完成了,实际上,您可以完全将其排除在运行时可用之外。现在关于弹簧部分:
首先,您说您自己正在尝试创建ServiceImpl
类的实例,为什么?它是一个 spring bean(你已经在上面放了一个@Service
注解),所以让 Spring 管理这个类。
有了这个定义,放在@Autowired
final 字段上在春天是行不通的。看到这个线程,所以你不应该@Autowired
放在这些字段上。幸运的是,Spring 在其最新版本中足够聪明,可以理解如果该类有一个构造函数(在您的情况下是您使用 Lombok 生成的构造函数),spring 将调用它来创建您的类的实例,而不是字段注入,您将使用构造函数注入。
推荐阅读
- python - python中的索引
- javascript - 在其他反应页面上显示 API 数据
- python - Python RegEx 查找接近(之前和/或之后)特定单词的数值
- quanteda - 如何在 ac() 函数中添加带有单词的文件。量子
- amazon-web-services - 限制对我的 S3 存储桶的读写访问
- django - 未调用 Django REST Framework 字段序列化程序验证
- r - 绘制等值线图时出错
- go - 不能在字段值中使用提供者(类型 *[]versioner.ProviderResponse)作为类型 []*versioner.ProviderResponse
- node.js - 用passportjs认证后没有人要求回答
- php - 如何仅使用没有 ajax/jquery 的 php 创建依赖下拉列表