使用 Spring bean 与 Mapstruct 的静态实例模式

问题描述

我知道您可以使用注解 @Mapper(componentModel = “spring”) 来使用 Spring 来管理/注入映射器依赖项。我的问题是,与在映射器类本身中声明实例变量相比,这种方法有什么优势:

@Mapper
public interface SomeMapper {
    SomeMapper INSTANCE = Mappers.getMapper(SomeMapper.class);

    SomethingElse mapSomethingToSomethingElse(Something something);
}

...

// Clients using mapper
SomethingElse result = SomeMapper.INSTANCE.mapSomethingToSomethingElse(input);

解决方法

当使用 Spring 依赖注入来注入映射器时,您最终会添加额外的构造函数参数/实例字段,这是可取的,因为它使类开始依赖太多依赖项并且很可能应该重构的情况变得更加明显(例如,想想声纳的规则 cty type system)。

另一个优点是,由于您在 Spring 上下文中将映射器注册为 bean,因此您可以利用框架功能轻松地在映射器中注入依赖项,在运行时通过 'Too many parameters' 自定义所有映射器并依赖所有其他看起来合适的框架抽象。

我想说的是,由于您已经在应用程序中使用 Spring,因此几乎没有理由不将映射器注册为 Spring bean 并以 DI 方式注入它们,而不是将它们转换为静态工具。