对象转换传输规范SpringBeanUtil工具类封装
前言
上一集我们已经完成了SpringBoot3.X + MybatisPlus的逆向工程,这一集我们将会完成对象转换传输规范SpringBeanUtil工具类的封装。
在讲主要内容的之前,我们将会补充一些小知识。
N方库
在软件开发中,库(Library)是一组预先编写好的代码,可以被多个不同的程序调用以实现特定的功能,从而避免重复编写相同的代码。根据库的来源和使用范围,可以将库大致分为以下几类
一方库(First-party Library)
- 这些库通常是项目团队自己开发的,仅供本项目或本工程内部的子项目模块使用。
- 它们可能不会对外发布,或者仅在项目团队内部共享。
- 由于是内部开发,因此版本控制、更新和维护都由项目团队自己负责。
二方库(Second-party Library)
- 这类库是由公司内部的其他团队或部门开发的,并且发布到了公司内部的中央仓库中。
- 它们可供公司内部的其他应用或项目依赖使用,但不会对外公开。
- 通常,二方库会有一定的版本管理和兼容性保证,以确保公司内部项目的顺利集成和使用。
三方库(Third-party Library)
- 这是最常见的库类型,指的是由公司外部的组织或个人开发的开源库。
- 这些库可以在互联网上公开获取,并且遵循特定的开源许可证,允许任何人使用、修改和分发。
- 三方库的使用可以大大加速开发过程,但同时也需要考虑许可证合规性、安全性和维护更新的问题。
POJO实体类
POJO(Plain Ordinary Java Object)是一个术语,用来描述那些没有遵循特定Java EE规范的Java对象。它们是简单的Java类,通常用于数据传输和业务逻辑的实现。以下是对POJO概念的一些说明:
定义和特点
- POJO是一个简单的Java类,不依赖于任何特定的Java EE规范。
- 它们通常只包含标准的JavaBean属性(即私有字段)和对应的getter/setter方法。
用途
- POJOs常用于表示数据结构,例如在客户端和服务器之间传输的数据。
- 它们也用于封装业务逻辑,使得代码更加模块化和可重用。
类型
- DO(Data Object):数据对象,通常用于数据库操作,代表数据库中的一条记录。
- DTO(Data Transfer Object):数据传输对象,用于不同系统或模块之间的数据传输。
- BO(Business Object):业务对象,封装业务逻辑和业务数据。
- VO(View Object):视图对象,用于展示层,通常包含从多个DO或DTO组合的数据。
领域模型命名规约
领域模型的命名规约是软件开发中用于保持代码清晰和一致性的一种实践。以下是对您提供的命名规约的扩展说明:
数据对象(Data Object, DO)
- 命名规约:通常以
xxxDO
命名,其中xxx
代表数据表的名称。 - 用途:DO通常直接映射到数据库表,包含与表字段对应的属性和基本的数据操作方法。
数据传输对象(Data Transfer Object, DTO)
- 命名规约:以
xxxDTO
命名,其中xxx
代表业务领域相关的名称。 - 用途:DTO用于在应用程序的不同层之间传输数据,特别是在服务层和表示层之间。它们通常包含业务逻辑所需的数据,但不包含数据访问逻辑。
请求对象(Request Object)
- 命名规约:接收前端JSON对象请求的类命名为
XXXReq
,其中XXX
代表请求所关联的业务领域或操作。 - 用途:这些对象通常用于封装从前端接收的请求数据,方便在后端进行处理。
SpringBeanUtil代码实现
public class SpringBeanUtil {
/**
* 把源对象的属性值复制到目标对象中。
* 该方法通过反射创建目标对象的实例,并使用BeanUtils的copyProperties方法将源对象的属性值复制到新创建的目标对象中。
* 这样做的目的是为了在不改变原有对象的情况下,创建一个具有相同属性值的新对象。
*
* @param source 源对象,其属性值将被复制。
* @param target 目标对象的Class,用于创建新对象并复制属性值。
* @param <T> 目标对象的类型参数。
* @return 新创建的并已填充了属性值的目标对象。
* @throws RuntimeException 如果在创建目标对象实例或复制属性过程中发生异常。
*/
public static <T> T copyProperties(Object source, Class<T> target) {
try {
// 通过反射无参构造方法创建目标对象的实例
T t = target.getConstructor().newInstance();
// 使用BeanUtils的copyProperties方法复制源对象的属性到目标对象
BeanUtils.copyProperties(source, t);
return t;
} catch (Exception e) {
// 捕获并抛出运行时异常,以方便调用方处理异常情况
throw new RuntimeException(e);
}
}
/**
* 复制属性值到新的对象列表。
* 该方法通过遍历源对象列表,将每个源对象的属性值复制到新建的目标对象中,然后将这些目标对象添加到一个新的列表中返回。
* 这种方式适用于需要根据已有对象列表创建一个新的具有相同属性的对象列表的场景。
*
* @param sourceList 源对象列表,可以包含任意类型的对象。
* @param target 目标对象的类类型,用于创建新的目标对象。
* @param <T> 目标对象的类型参数。
* @return 包含复制了属性值的新对象的列表。
*/
public static <T> List<T> copyProperties(List<?> sourceList, Class<T> target) {
// 初始化目标对象列表
ArrayList<T> targetList = new ArrayList<>();
// 遍历源对象列表,对每个源对象进行属性复制操作
sourceList.forEach(item -> targetList.add(copyProperties(item, target)));
// 返回包含复制了属性值的新对象的列表
return targetList;
}
}
这段代码定义了一个名为 SpringBeanUtil
的工具类,它提供了两个静态方法来复制对象属性值。以下是对这两个方法的详细解释:
方法一:copyProperties(Object source, Class<T> target)
目的:创建一个新的目标对象,并将其属性值从源对象复制过来。
步骤:
- 创建目标对象实例:使用Java反射API,调用目标类
target
的无参构造函数来创建一个新的实例T t
。 - 复制属性:使用
BeanUtils.copyProperties
方法将源对象source
的属性值复制到新创建的目标对象t
中。 - 异常处理:如果在创建实例或复制属性过程中发生异常,捕获这些异常并抛出一个新的
RuntimeException
。
返回值:返回新创建的并已填充了属性值的目标对象。
使用场景:当你需要从现有的对象创建一个新的对象,并且希望新对象具有与原对象相同的属性值时,这个方法非常有用。例如,你可能需要在不同的业务逻辑中使用相同的数据,但又不想改变原始对象。
方法二:copyProperties(List<?> sourceList, Class<T> target)
目的:复制一个对象列表中的每个对象的属性到新的对象列表中。
步骤:
- 初始化目标列表:创建一个新的
ArrayList<T>
来存储复制后的对象。 - 遍历源列表:使用Java 8的
forEach
循环遍历源对象列表sourceList
。 - 复制单个对象:对于列表中的每个源对象
item
,调用第一个copyProperties
方法来创建一个新的目标对象,并将其添加到目标列表targetList
中。 - 返回结果:返回包含所有新创建对象的目标列表。
返回值:返回一个新的列表,其中包含了源列表中每个对象属性值复制后的新对象。
使用场景:当你有一个对象列表,并且需要根据这个列表创建一个新的对象列表,同时保持原有属性值不变时,这个方法非常有用。例如,在数据传输或在不同服务层之间传递数据时,可能需要这样的操作。