В обсуждениях и примерах 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", указанный выше контекст указан в разделе "using", поэтому после генерации кода контекст автоматически подключается, и все необходимые проверки создаются в классе Impl.
Был задан следующий вопрос: когда контекст очищается / воссоздается?Сопоставитель хранится в классе конфигурации приложения, поэтому я предполагаю, что контекст также будет "жить" все это время, и он станет слишком большим и будет содержать недопустимые объекты после всех сопоставлений.В то время как я ожидал, что он будет «жить» во время одиночного вызова карты.
Например, есть Entity1 (с контекстом в разделе использования), который имеет поле Entity2, которое снова связано с Entity1.Я ожидаю, что контекст будет инициализироваться перед каждым отображением Entity1 верхнего уровня, чтобы избежать зависимости цикла во время отображения Entity1.Entity2.Entity1.И его можно очистить после завершения сопоставления.
Итак, какова действительная логика в отношении очистки контекста HashMap и как можно предотвратить его перегрузку?