在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清理的实际逻辑是什么?如何防止其过载?
答案 0 :(得分:0)
您所引用的示例是world peace的一部分,在该示例中没有用作Spring bean。
CycleAvoidingMapperContext
的概念将用作@Context
属性。
每次将其传递给映射方法时,您都会创建一个新实例。