MapStruct的常用注解及使用场景

1. @Mapper

  • 作用: 标记接口或抽象类为映射器,自动生成实现类代码,支持配置全局映射策略。
  • 关键属性
    • componentModel:指定组件模型(如 springcdi),用于依赖注入。
    • uses:引入其他映射器或工具类。
    • unmappedTargetPolicy:未映射字段的处理策略(如 IGNORE 或 ERROR)。
  • 使用场景: 定义所有映射方法的入口,适用于任何需要对象转换的场景。
  • 示例
    @Mapper(componentModel = "spring", uses = DateUtils.class)
    public interface UserMapper {
        UserDTO toUserDTO(User user);
    }

2. @Mapping

  • 作用: 定义单个字段的映射规则,支持属性名转换、表达式、常量等。
  • 关键属性
    • source:源对象属性名(支持嵌套路径,如 user.address.city)。
    • target:目标对象属性名。
    • expression
### MapStruct 与 AutoMapper 注解的属性对比及使用方法 #### MapStruct 的 `@Mapper` 及其相关注解 MapStruct 是一种用于 Java 对象之间映射的代码生成器工具。它通过注解驱动的方式自动生成类型安全的对象映射代码,从而减少手动编写繁琐的映射逻辑。 - **核心注解**: - `@Mapper`: 声明一个 Mapper 接口,表示该接口是一个对象映射器[^1]。 ```java @Mapper(componentModel = "spring") // 将组件模型设置为 Spring Bean 方便注入 public interface CarMapper { CarMapper INSTANCE = Mappers.getMapper(CarMapper.class); CarDto carToCarDto(Car car); // 映射方法声明 } ``` - **常用属性**: - `componentModel`: 指定生成的实现类遵循哪种框架模式(如 `"spring"` 或 `"cdi"`)。这使得生成的 Mapper 实现能够被容器管理。 - `uses`: 如果需要额外的子映射器,则可以通过此参数指定它们。 ```java @Mapper(uses = {SeatConfigurationMapper.class}) public interface CarMapper { CarDto carToCarDto(Car car); } ``` - `unmappedTargetPolicy`: 配置未映射的目标字段策略,例如抛出警告或错误。 #### MapStruct Plus 扩展功能 MapStruct Plus 提供了对 MapStruct 功能的进一步增强支持,允许更灵活的配置和更高的兼容性[^3]。 - **特性**: - 支持无缝替换已有依赖而无需大幅调整现有代码结构。 - 内建更多复杂场景下的自动化处理能力,比如集合类型的深度嵌套映射[^4]。 #### AutoMapper (C#) 的基本概念及其注解/属性 AutoMapper 是 C# 中广泛使用的对象到对象映射库,主要用于简化不同数据层之间的转换过程。 - **核心方法**: - 使用 Fluent API 定义源类型和目标类型的映射关系。 ```csharp var config = new MapperConfiguration(cfg => cfg.CreateMap<Source, Destination>()); IMapper mapper = config.CreateMapper(); Destination destinationObject = mapper.Map<Destination>(sourceObject); ``` - **主要特点**: - 自动生成简单的成员匹配规则;对于复杂的映射需求,可通过 `.ForMember()` 方法显式定义映射逻辑[^2]。 - 支持条件映射以及值解析函数定制化操作。 | 属性名称 | 描述 | |----------|------| | ForMember | 当默认命名约定无法满足时,可用来指定特定字段如何映射。 | #### MapStruct vs AutoMapper 特性比较表 | 特性 | MapStruct (Java) | AutoMapper (C#) | |---------------------|----------------------------------------------------------------------------------------------------|-----------------------------------------------------------------------------------------------| | 编程语言 | Java | C# | | 默认行为 | 基于字段名的一致性完成简单映射 | 同样基于字段名一致性,默认情况下忽略大小写差异 | | 性能优化 | 在编译期生成高效的静态映射代码 | 运行时期间动态构建表达树来执行映射 | | 错误检测时机 | 编译阶段即可发现潜在问题 | 主要在运行时捕获异常 | | 是否侵入业务代码 | 不侵入,仅需定义好接口 | 要求开发者主动调用初始化配置 | #### 示例代码展示 以下是两种技术分别实现相同功能的一个例子: ##### MapStruct 示例 ```java @Mapper public interface UserMapper { UserMapper INSTANCE = Mappers.getMapper(UserMapper.class); @Mapping(source = "name", target = "fullName") UserDTO userToUserDTO(User user); } ``` ##### AutoMapper 示例 ```csharp var configuration = new MapperConfiguration(cfg => { cfg.CreateMap<User, UserDTO>() .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name)); }); IMapper mapper = configuration.CreateMapper(); UserDTO dto = mapper.Map<UserDTO>(user); ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值