首页 文章

Mapstruct中的CycleAvoidingMapperContext清理

提问于
浏览
0

在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 回答

  • 0

    您引用的示例是mapstruct-mapping-with-cycles的一部分,并且在那里它不用作Spring bean .

    CycleAvoidingMapperContext 的想法将被用作 @Context 属性 .

    每次将其传递给映射方法时,都将创建一个新实例 .

相关问题