Mapstruct中的CycleAvoidingMapperContext清理

时间:2018-10-25 08:30:03

标签: java mapstruct

在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类中创建。

提出了以下问题:何时清理/重新创建上下文?映射器存储在应用程序的config类中,因此我想上下文也会一直处于“生存状态”,并且上下文变得太大并在所有映射之后包含无效实体。虽然我希望它在单个地图调用中可以“运行”。

例如,有一个Entity1(在uses部分中有上下文),它具有Entity2字段,该字段再次链接到Entity1。我希望在每个顶级Entity1映射之前初始化上下文,以避免在Entity1.Entity2.Entity1映射期间出现循环依赖性。并且可以在映射完成后将其清除。

那么,有关上下文HashMap清理的实际逻辑是什么?如何防止其过载?

1 个答案:

答案 0 :(得分:0)

您所引用的示例是world peace的一部分,在该示例中没有用作Spring bean。

CycleAvoidingMapperContext的概念将用作@Context属性。

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