MapStruct - @Mapper 注释不创建 bean

spring

1个回答

写回答

小小小酥

2025-06-14 19:25

+ 关注

Java
Java

MapStruct - @Mapper 注解不创建 bean

MapStruct 是一个用于 Java Bean 映射的代码生成器,旨在简化数据传输对象(DTO)和实体类之间的转换。MapStruct 提供了一个方便的注解 @Mapper,用于自动生成 DTO 和实体类之间的映射代码。然而,在某些情况下,我们可能希望仅仅使用 @Mapper 注解来定义映射规则,而不实际创建一个映射器实例。本文将介绍如何使用 @Mapper 注解不创建 bean,以及其应用场景和案例代码。

使用 @Mapper 注解

在使用 MapStruct 进行 Bean 映射时,通常会在映射器接口上添加 @Mapper 注解。这个注解有很多属性可以配置,例如 componentModel、uses、mappingControl 等。其中,componentModel 属性用于指定生成的映射器类是否作为 Spring Bean 进行管理,默认为"componentModel = "default"",即不创建 bean。

例如,我们有一个 UserMapper 接口,用于将 UserDTO 转换为 User 实体类:

@Mapper(componentModel = "default")

public interface UserMapper {

UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

UserDTO toDto(User user);

User toEntity(UserDTO userDto);

}

在上述代码中,我们使用了 @Mapper 注解,并将 componentModel 属性设置为"default",这意味着不会为 UserMapper 接口生成一个映射器实例。

应用场景

使用 @Mapper 注解而不创建 bean 的主要应用场景是在需要定义映射规则但不需要实际执行映射的情况下,例如在测试代码中。在测试中,我们可能只关心映射规则是否正确,而不需要实际进行映射操作。

案例代码

下面是一个简单的示例,展示了如何使用 @Mapper 注解不创建 bean:

@Mapper(componentModel = "default")

public interface UserMapper {

UserMapper INSTANCE = Mappers.getMapper(UserMapper.class);

UserDTO toDto(User user);

User toEntity(UserDTO userDto);

}

public class UserMapperTest {

@Test

public void testMapping() {

UserMapper mapper = UserMapper.INSTANCE;

UserDTO userDto = new UserDTO();

userDto.setId(1L);

userDto.setUsername("john");

User user = mapper.toEntity(userDto);

assertEquals(userDto.getId(), user.getId());

assertEquals(userDto.getUsername(), user.getUsername());

}

}

在上述代码中,我们首先定义了一个 UserMapper 接口,并使用 @Mapper 注解来指定不创建 bean。然后,在测试代码中,我们通过 UserMapper.INSTANCE 获取映射器实例,并使用该实例进行映射操作。在测试中,我们不需要实际的映射结果,只需要验证映射规则是否正确。

通过使用 MapStruct 的 @Mapper 注解,并设置 componentModel 属性为"default",我们可以仅仅定义映射规则而不实际创建映射器实例。这在某些场景下非常有用,例如在测试代码中验证映射规则是否正确。

举报有用(4分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号