/ 详情

没懂你这个项目要解决的问题

待办的
创建于  
2024-04-03 19:22

看例子就像是一个序列化和反序列化的过程,或者通过反射也可以解决,一些开源的BeanUtil或者自己写一个JSON的序列化和反序列化也可以搞定

评论 (5)

Start 创建了任务 10个月前

当你想知道某个属性在哪里被设置值时就会用上了

1374229 easii 1710989212 easii 拥有者 10个月前
  1. 与序列化和反序列化没有关系,是为了解决不是不同类型转换的问题,常见于多层类结构设计,例如 DTO 转为 VO。这个项目在编译的时候,会生成两个类转换的相关代码,通过调用来源类的 getter 和 setter 来实现。
  2. 与反射、BeanUtil、JSON 有什么区别:两者没有任何关系和相似性,虽然可以实现部分相同的目标。
146900 3dcrm 1578919520 Start
回复 easii 拥有者
8个月前

和lombok有没有冲突? 下列代码编译不了

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.7.7</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<groupId>com.didispace</groupId>
	<artifactId>chapter3-6</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<description>使用MyBatis(xml配置方式)</description>

	<properties>
		<java.version>1.8</java.version>
		<mapstruct-plus.version>1.1.3</mapstruct-plus.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.1.1</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
		</dependency>

		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<scope>provided</scope>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <scope>test</scope>
        </dependency>

		<!--
			<dependency>
				<groupId>org.mapstruct</groupId>
				<artifactId>mapstruct</artifactId>
				<version>1.5.0.Final</version>
				<scope>provided</scope>
			</dependency>

			<dependency>
				<groupId>org.mapstruct</groupId>
				<artifactId>mapstruct-processor</artifactId>
				<version>1.5.0.Final</version>
				<scope>provided</scope>
			</dependency>
		-->

		<dependency>
			<groupId>io.github.linpeilie</groupId>
			<artifactId>mapstruct-plus-spring-boot-starter</artifactId>
			<version>${mapstruct-plus.version}</version>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>

			<plugin>
				<groupId>org.apache.maven.plugins</groupId>
				<artifactId>maven-compiler-plugin</artifactId>
				<version>3.8.1</version>
				<configuration>
					<source>1.8</source>
					<target>1.8</target>
					<annotationProcessorPaths>
						<path>
							<groupId>io.github.linpeilie</groupId>
							<artifactId>mapstruct-plus-processor</artifactId>
							<version>${mapstruct-plus.version}</version>
						</path>
					</annotationProcessorPaths>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User {

    private Long id;
    private String name;
    private Integer age;
    private String sex;
    private LocalDateTime createdAt;

    public User(String name, Integer age) {
        this.name = name;
        this.age = age;
    }
}
easii 添加了
 
question
标签
10个月前
easii 置顶等级设置为 10个月前

当你问出这个问题的时候,就知道你没有使用过MapStruct,这个项目的目的是为了让MapStruct更易用(MapStruct的配置比较繁琐)。

BeanUtil确实也可以实现bean copy,但是是在运行时层面的,假设我有100个对象甚至更多需要copy那它就需要跑100遍甚至更多的反射,反射本来就是需要ClassLoader介入的,本来性能就很慢,更别说copy大量的Bean list,并且在JDK17之后,引入了一些反射相关的限制,简而言之就是收紧了使用者使用反射的一些权限。JSON序列化就懒得说了,根本不是一个东西,你以为序列化是什么轻量级的东西吗?

MapStruct的原理其实就是帮你生成了调用复制的 getter 和 setter 方法:

public UserVo convertToVo(User user){
    UserVo vo = new UserVo();
    vo.setUserId(user.getUserId);
    vo.setUserName(user.getUserName);
    // ...
    return vo;
}

哪个性能更好你自己判断。

easii 置顶等级 修改为不置顶 10个月前

知道即学到,谁都是从小白开始的。

登录 后才可以发表评论

状态
负责人
里程碑
Pull Requests
关联的 Pull Requests 被合并后可能会关闭此 issue
分支
开始日期   -   截止日期
-
置顶选项
优先级
参与者(5)
3028238 cyh724 1638148643 1374229 easii 1710989212 1407376 dyyx19980911 1578950755 1544819 zhuchao ko 1723452324 146900 3dcrm 1578919520