# wen-common
**Repository Path**: VwenX/wen-common
## Basic Information
- **Project Name**: wen-common
- **Description**: 许文的Java工具库
- **Primary Language**: Java
- **License**: Not specified
- **Default Branch**: dev
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 0
- **Created**: 2023-09-11
- **Last Updated**: 2025-11-05
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
## 简介
个人的**Java工具库**,无三方依赖,不耦合特定开发框架。自己也用主流工具集,所以也不去造重复的轮子。
## 模块
| 模块 | 说明 |
|-----------------|------------|
| wen-common-bean | 存放注解、实体等定义 |
| wen-common | 工具包 |
| wen-common-test | 测试 |
## 安装
### Maven
```xml
io.github.vwenx
wen-common
${version}
```
- 对其他服务提供接口/实体声明的`api`包建议只依赖`wen-common-bean`,更轻量
```xml
io.github.vwenx
wen-common-bean
${version}
```
## 主要组件
| 主要组件 | 描述 | 场景 | demo |
|---------------|------------|----------------------|----------------------------------------------------------------------------------------------------------------------------------|
| FieldFill | 字段填充工具 | 属性翻译/转换 | [FieldFillTest.java](wen-common-test%2Fsrc%2Fmain%2Fjava%2Fio%2Fgithub%2Fvwenx%2Fcommon%2Ftest%2Ffieldfill%2FFieldFillTest.java) |
| TreeUtil | 树结构数据处理 | List <-> Tree | [TreeTest.java](wen-common-test%2Fsrc%2Fmain%2Fjava%2Fio%2Fgithub%2Fvwenx%2Fcommon%2Ftest%2Ftree%2FTreeTest.java) |
| ProcessorPool | 处理器池 | 可对非线程安全的处理器实例池化共享 | [ProcessorPool.java](wen-common%2Fsrc%2Fmain%2Fjava%2Fio%2Fgithub%2Fvwenx%2Fcommon%2Futil%2FProcessorPool.java) |
| BeanDiff | Bean差异比对工具 | 如业务数据变更记录需要比对出变化的属性值 | [BeanDiffTest.java](wen-common-test%2Fsrc%2Fmain%2Fjava%2Fio%2Fgithub%2Fvwenx%2Fcommon%2Ftest%2Futil%2FBeanDiffTest.java) |
## 重点组件说明
### [FieldFill](wen-common%2Fsrc%2Fmain%2Fjava%2Fio%2Fgithub%2Fvwenx%2Fcommon%2Ffieldfill) 字段填充工具
- 通过在实体字段上注解声明的规则,来处理字段的自动赋值。避免为了额外返回个别字段去写连表、穿插调用服务/转换枚举的代码。
- 可扩展的填充器设计,自由处理字段值的转换、填充,调用服务查询、逻辑处理...都可以。
- 基于原生字段填充,并非如`Jeecg`之类通过JSON序列化做手脚,接口文档友好,后端也能使用字段。
- 常用场景:
- 关联信息 如:用户的创建人字段存的是创建人的用户id,还需要给前端返回创建人的名称
- 枚举信息 如:用户的性别、字典code与文本的映射 (虽然没有BFF层的后端不该做这些)
- [FieldFillTest.java 测试代码示例](wen-common-test%2Fsrc%2Fmain%2Fjava%2Fio%2Fgithub%2Fvwenx%2Fcommon%2Ftest%2Ffieldfill%2FFieldFillTest.java)
##### 使用
1. 实现并注册自己需要的填充器
- 填充器实现相关包`io.github.vwenx.common.fieldfill.stuffer`
- 填充器需要实现`FieldFillStuffer`接口,包内也提供了一些抽象封装和快捷构建的类
- 子包`builder`提供了填充器的快捷构建支持,使用Lambda引用构建减少使用者编写class等冗长的结构性代码
- 子包`impl`提供了一些基础填充器实现(目前有基于枚举的填充器)
- 实现填充器后,使用`FieldFillStufferRegistry.register`方法注册
2. 在需要处理的字段上使用注解定义规则
```java
class Demo{
private int sex;
// 使用枚举类型的填充器 将sex字段的值对应SexEnum的type,取出SexEnum的text填充到sexText字段上
@FieldFill(type = FieldFillType.Enum, source = "sex", classArgs = SexEnum.class, args = {"type", "text"})
private String sexText;
// 声明扫描此字段对象内部的填充信息
@ScanFieldFill
private List subList;
}
```
3. 调用字段填充助手来填充数据
- `FieldFillHelper.fill(demoList);`
- `FieldFillHelper`将会扫描数据字段的`@FieldFill`注解信息来收集需要填充的任务,根据任务类型分组来调用对应注册的填充器实现。
##### 集成
- 可自由集成到拦截器/AOP,业务开发只需要在字段中定义注解,就能自动完成字段填充,保持主逻辑代码的干净。
##### 提示
- 本文档未提及的细节及高级用法,可以参阅测试包里的代码示例,及源码注释。
- 填充助手会按类型,将同类任务聚合一次交给填充器,填充实现可以使用批量查询来优化时间。(如: 数据库查询、服务调用等RPC场景)
- 涉及对象嵌套的数据结构,只有在字段上定义了`@ScanFieldFill`注解,才会向下一层去扫描填充信息。
- 如实体继承中重复定义了同名字段,解析器会选择抛出异常。