在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类中创建 .
提出以下问题:清理/重新创建上下文时?映射器存储在app的配置类中,因此我猜测上下文在所有时间都是“活着的”,并且在所有映射之后它变得太大并且包含无效实体 . 虽然我期望它在单一 Map 通话期间“生活” .
例如,存在Entity1(在使用部分中具有上下文),其具有Entity2字段,其再次链接到Entity1 . 我希望在每个顶级Entity1映射之前初始化上下文,以避免在Entity1.Entity2.Entity1映射期间的循环依赖性 . 并且可以在映射完成后清除它 .
那么,关于上下文HashMap清理的实际逻辑是什么以及如何防止其重载?
1 回答
您引用的示例是mapstruct-mapping-with-cycles的一部分,并且在那里它不用作Spring bean .
CycleAvoidingMapperContext
的想法将被用作@Context
属性 .每次将其传递给映射方法时,都将创建一个新实例 .