一、Mapstruct使用教程
Mapstruct是一個Java基於註解的Bean映射工具,它可以通過註解為不同類型的Java Bean自動生成映射器代碼,以實現不同類型Java Bean之間屬性的複製。下面我們來看一下如何在項目中使用Mapstruct:
1、添加依賴
<dependencies>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.1.Final</version>
</dependency>
</dependencies>
2、配置Maven插件
在pom.xml文件中添加Mapstruct的Maven插件,以在編譯時自動生成映射器代碼:
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.0</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.1.Final</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
3、定義映射器接口
創建一個接口,使用MapStruct註解定義映射關係和轉換規則。
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
CarDTO carToCarDTO(Car car);
List<CarDTO> carsToCarDTOs(List<Car> cars);
}
4、使用映射器接口
現在可以使用在上一步中定義的映射器接口進行轉換。比如:
public class CarService {
public CarDTO getCarById(int id) {
Car car = carDao.getCarById(id);
return CarMapper.INSTANCE.carToCarDTO(car);
}
}
二、Mapstruct原理
MapStruct是通過自動生成Java映射器實現屬性映射的。它的工作原理如下:
1、生成源代碼
在編譯時,MapStruct會掃描所有使用@Mapper註解的接口,然後自動生成Java代碼來實現這些接口。這些Java代碼包括源Bean和目標Bean之間屬性的映射代碼。
2、生成映射器實例
編譯後,MapStruct會將生成的Java代碼打包成一個.jar文件,然後被添加到項目的classpath中。這時,就可以使用Mappers.getMapper()靜態方法獲取映射器實例來實現Bean屬性映射。
3、根據註解生成Mapper代碼
在定義@Mapper註解時,使用source和target屬性來指定映射源Bean和目標Bean。使用@Mapping註解來規定源Bean和目標Bean屬性之間的映射關係。同時,MapStruct允許開發者自定義映射規則,比如類型轉換等。
三、Mapstruct用法
1、使用默認規則
MapStruct具有一些默認規則,比如基本類型之間的映射,容器之間的映射等。如果源Bean和目標Bean的屬性名稱相同且類型相同,就無需額外的映射定義。
2、使用@Mapper註解
在過程中,可以使用@Mapper註解來定義屬性映射規則。在@Mapper註解上設置componentModel屬性的值為spring,可以使用@Autowired來注入Mapper。
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
CarDTO carToCarDTO(Car car);
List<CarDTO> carsToCarDTOs(List<Car> cars);
}
3、使用@MapperConfig註解
可以在使用@Mapper註解的類上使用@MapperConfig註解設置映射器的通用配置,從而省略每個映射器的相同重複代碼。
@MapperConfig(
componentModel = "spring",
nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
public interface MappingConfig {}
4、使用@Mappings註解
@Mappings註解用於集中配置常用的@Mapping註解規則,以避免在每個映射器中都重複編寫單個規則。
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mappings({
@Mapping(source = "numberOfSeats", target = "seatCount"),
@Mapping(source = "type", target = "model"),
@Mapping(source = "price", target = "price", numberFormat = "$#.00")
})
CarDTO carToCarDTO(Car car);
}
5、Spring Boot配置生命周期回調
在Spring Boot應用程序中使用MapStruct時,可以實現映射器接口上的SpringBean映射,使用@PostConstruct啟動映射器。
@Mapper(componentModel = "spring")
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@PostConstruct
default void init() {
// Do Some initialization work
}
...
}
四、Mapstruct設置默認值
1、使用@DefaultValue註解
可以使用@DefaultValue註解在源Bean屬性為空時設置默認值。
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
@Mapping(source = "type", target = "model")
@Mapping(target = "price", numberFormat = "$#.00")
@Mapping(target = "description", defaultValue = "This car has no description.")
CarDTO carToCarDTO(Car car);
}
2、使用@CollectionMapping註解
在@CollectionMapping註解中,通過使用@IterableMapping或者@MapMapping註解可以設置集合屬性的默認值。
@Mapper
public interface CarMapper {
CarMapper INSTANCE = Mappers.getMapper(CarMapper.class);
@Mapping(source = "numberOfSeats", target = "seatCount")
@IterableMapping(nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT)
List<String> featuresToFeatureNames(List<Feature> features);
}
以上就是關於Mapstruct使用的詳細講解。它可以讓我們在編寫JavaBean之間複製屬性時更加方便,提高了開發效率。在實際項目中使用Mapstruct,可以讓我們更加專註於業務邏輯的實現。
原創文章,作者:SSLRK,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/330937.html