java - Mapstruct 中的 CycleAvoidingMapperContext 清理
问题描述
在 Mapstruct 讨论和示例中,引入了 CycleAvoidingMapperContext 用法,以实际避免循环依赖。
@Component
public class CycleAvoidingMappingContext {
private Map<Object, Object> knownInstances = new IdentityHashMap<Object, Object>();
@BeforeMapping
public <T> T getMappedInstance(Object source, @TargetType Class<T> targetType) {
return (T) knownInstances.get( source );
}
@BeforeMapping
public void storeMappedInstance(Object source, @MappingTarget Object target) {
knownInstances.put( source, target );
}
}
我的映射器使用 componentModel = "spring",上面的上下文在 "uses" 部分中指定,因此在代码生成后,上下文将自动装配,所有必要的检查都在 Impl 类中创建。
提出了以下问题:何时清理/重新创建上下文?映射器存储在应用程序的配置类中,所以我猜上下文也会一直“活着”,并且在所有映射之后它变得太大并且包含无效实体。虽然我希望它在单个地图调用期间“活着”。
例如,有 Entity1(在 uses 部分有上下文),它有 Entity2 字段,它再次链接到 Entity1。我希望在每个顶级 Entity1 映射之前初始化上下文,以避免 Entity1.Entity2.Entity1 映射期间的循环依赖。并且可以在映射完成后进行清理。
那么,关于上下文 HashMap 清理的实际逻辑是什么以及如何防止其重载?
解决方案
您所指的示例是mapstruct-mapping-with-cycles 的一部分,在那里它不用作 Spring bean。
的想法CycleAvoidingMapperContext
是用作@Context
属性。
每次将它传递给映射方法时,您都会创建一个新实例。
推荐阅读
- c# - Bruel & Kjaer 2250 SDK - 如何从头开始设置 C# 项目?
- javascript - hAxis 中的 Google 折线图月份标签不正确
- python - 如何从“data-at”中提取文本?
- bash - 从文件中提取不满足特定条件的行
- java - 在第一次 myBatis 生成器得到很多“无法解析为一个类型”之后
- java - 32 位版本的 SonarQube 与 64 位 java
- php - PHP 常量表达式中的连接数据库包含无效操作
- java - 我正在使用 spring boot 将 JSON ito 转换为 java oject 但是当我运行它时它会抛出一个文件未找到错误
- angular - 无选择的 Mat Datepicker 验证
- wordpress - 根据WordPress中的表单字段调用自定义URL