refactor(service): 统一Service缓存为VO对象并优化关联实体处理
重构Service类实现,将QueryService泛型参数调整为VO类型,确保缓存VO对象而非实体。优化关联实体处理逻辑,减少重复代码。修改findById方法返回VO对象,新增getById方法获取实体。更新相关调用点以适配新接口。 调整WebSocket处理、控制器及Service实现,确保数据类型一致性。完善文档记录重构过程及发现的问题。为后续优化提供基础架构支持。
This commit is contained in:
@@ -11,20 +11,11 @@ flowchart TD
|
||||
subgraph 服务层
|
||||
direction LR
|
||||
Service1[Service类
|
||||
实现IEntityService<Vo>]
|
||||
实现IEntityService<Model>和QueryService<Vo>]
|
||||
Service2[Service类
|
||||
实现IEntityService<Vo>]
|
||||
实现IEntityService<Model>和QueryService<Vo>]
|
||||
Service3[Service类
|
||||
实现IEntityService<Vo>]
|
||||
end
|
||||
|
||||
subgraph WebSocket服务层
|
||||
WebSocketHandler[WebSocketServerHandler
|
||||
处理WebSocket连接]
|
||||
WebSocketTaskManager[WebSocketServerTaskManager
|
||||
管理WebSocket任务]
|
||||
WebSocketCallbackManager[WebSocketServerCallbackManager
|
||||
处理服务调用回调]
|
||||
实现IEntityService<Model>和QueryService<Vo>]
|
||||
end
|
||||
|
||||
subgraph 数据转换层
|
||||
@@ -49,15 +40,6 @@ flowchart TD
|
||||
Controller -->|调用服务方法| Service1
|
||||
Controller -->|调用服务方法| Service2
|
||||
Controller -->|调用服务方法| Service3
|
||||
WebSocketHandler -->|注入服务| Service1
|
||||
WebSocketHandler -->|注入服务| Service2
|
||||
WebSocketHandler -->|注入服务| Service3
|
||||
WebSocketTaskManager -->|注入服务| Service1
|
||||
WebSocketTaskManager -->|注入服务| Service2
|
||||
WebSocketTaskManager -->|注入服务| Service3
|
||||
WebSocketCallbackManager -->|反射调用| Service1
|
||||
WebSocketCallbackManager -->|反射调用| Service2
|
||||
WebSocketCallbackManager -->|反射调用| Service3
|
||||
Service1 -->|转换VO到实体| Mapper
|
||||
Service2 -->|转换VO到实体| Mapper
|
||||
Service3 -->|转换VO到实体| Mapper
|
||||
@@ -74,7 +56,6 @@ flowchart TD
|
||||
|
||||
%% 关键修改点
|
||||
style RedisCache fill:#bbf,stroke:#333,stroke-width:2px
|
||||
style WebSocketCallbackManager fill:#fbb,stroke:#333,stroke-width:2px
|
||||
```
|
||||
|
||||
## 2. 分层设计和核心组件
|
||||
@@ -87,35 +68,26 @@ flowchart TD
|
||||
- **职责**: 实现业务逻辑,处理数据转换,调用Repository层进行数据操作,管理缓存
|
||||
- **核心组件**: 所有注解了@CacheConfig的Service类
|
||||
- **修改内容**:
|
||||
- 将IEntityService<T>的泛型T从实体类改为VO类
|
||||
- 修改实现的接口方法,添加数据转换逻辑
|
||||
- 确保缓存中存储的是VO对象而非实体类对象
|
||||
- Service类同时实现IEntityService<Model>和QueryService<Vo>接口
|
||||
- IEntityService接口泛型保持为实体类(Model)
|
||||
- QueryService接口泛型修改为VO类
|
||||
- 继承 VoableService<M, Vo>接口,实现 updateByVo 方法
|
||||
- 修改 findById 方法,返回VO对象,并且使用 @Cacheable(key = "#p0") 注解
|
||||
- 保留 getById 方法,调用 repository.findById(id) 返回实体对象
|
||||
|
||||
### 2.3 WebSocket服务层
|
||||
- **职责**: 处理WebSocket连接、消息传递、任务管理和回调处理
|
||||
- **核心组件**:
|
||||
- WebSocketServerHandler:处理WebSocket连接、消息传递和断开连接
|
||||
- WebSocketServerTaskManager:管理WebSocket任务的注册和执行
|
||||
- WebSocketServerCallbackManager:通过反射调用服务方法,处理回调
|
||||
- **影响**:
|
||||
- WebSocketServerCallbackManager直接调用IEntityService接口,泛型修改将对其产生直接影响
|
||||
- 需要特别关注createNewEntity、findEntityTypeInInterfaces等方法的实现
|
||||
- invokerFindByIdMethod、invokerFindAllMethod等方法需要适应VO类型的返回值
|
||||
|
||||
### 2.4 数据转换层
|
||||
### 2.3 数据转换层
|
||||
- **职责**: 负责实体类和VO类之间的数据转换
|
||||
- **核心组件**:
|
||||
- 现有的VoableService接口
|
||||
- 新增的实体-VO转换工具方法
|
||||
- WebSocketServerCallbackManager中的toVo方法
|
||||
- **设计考虑**: 可以使用工具类或在每个Service类中实现转换逻辑
|
||||
- 实体类自带的toVo()方法
|
||||
- **设计考虑**: 使用实体类自带的toVo()方法进行转换,简化代码结构
|
||||
|
||||
### 2.5 数据访问层
|
||||
### 2.4 数据访问层
|
||||
- **职责**: 提供对数据库的访问操作
|
||||
- **核心组件**: Spring Data JPA Repository接口
|
||||
- **影响**: 基本不受修改影响,仍然操作实体类
|
||||
|
||||
### 2.6 缓存层
|
||||
### 2.5 缓存层
|
||||
- **职责**: 存储VO对象,提高数据访问性能
|
||||
- **核心组件**: Redis缓存
|
||||
- **关键修改**: 确保只缓存VO对象,避免代理对象序列化问题
|
||||
@@ -137,14 +109,6 @@ flowchart TD
|
||||
实现IEntityService<Model>、QueryService<Vo>和VoableService]
|
||||
end
|
||||
|
||||
subgraph WebSocket服务
|
||||
WebSocketHandler[WebSocketServerHandler
|
||||
处理WebSocket连接] --> WebSocketTaskManager[WebSocketServerTaskManager
|
||||
管理WebSocket任务]
|
||||
WebSocketTaskManager --> WebSocketCallbackManager[WebSocketServerCallbackManager
|
||||
处理服务调用回调]
|
||||
end
|
||||
|
||||
subgraph 数据访问
|
||||
Repository[Repository接口
|
||||
操作实体类]
|
||||
@@ -170,13 +134,8 @@ flowchart TD
|
||||
ServiceImpl --> Entity
|
||||
ServiceImpl --> VO
|
||||
ServiceImpl <-->|缓存VO对象| RedisCache
|
||||
WebSocketHandler -->|注入| ServiceImpl
|
||||
WebSocketTaskManager -->|注入| ServiceImpl
|
||||
WebSocketCallbackManager -->|反射调用| IEntityService
|
||||
WebSocketCallbackManager -->|类型转换| VO
|
||||
|
||||
style RedisCache fill:#bbf,stroke:#333,stroke-width:2px
|
||||
style WebSocketCallbackManager fill:#fbb,stroke:#333,stroke-width:2px
|
||||
```
|
||||
|
||||
## 4. 接口契约定义
|
||||
@@ -186,7 +145,7 @@ flowchart TD
|
||||
```java
|
||||
public interface IEntityService<Model> {
|
||||
// 根据ID查询Model对象
|
||||
Model findById(Integer id);
|
||||
Model getById(Integer id);
|
||||
|
||||
// 根据查询规范和分页参数查询Model对象列表
|
||||
Page<Model> findAll(Specification<Model> spec, Pageable pageable);
|
||||
@@ -210,6 +169,9 @@ public interface IEntityService<Model> {
|
||||
|
||||
```java
|
||||
public interface QueryService<Vo> {
|
||||
// 根据ID查询Vo对象
|
||||
Vo findById(Integer id);
|
||||
|
||||
// 根据查询参数和分页条件获取Vo对象列表
|
||||
Page<Vo> findAll(JsonNode paramsNode, Pageable pageable);
|
||||
|
||||
@@ -220,27 +182,36 @@ public interface QueryService<Vo> {
|
||||
}
|
||||
```
|
||||
|
||||
### 4.2 Service实现类接口契约
|
||||
### 4.3 Service实现类接口契约
|
||||
|
||||
对于每个Service实现类,需要实现以下方法的契约转换:
|
||||
对于每个Service实现类,需要同时实现IEntityService<Model>和QueryService<Vo>接口:
|
||||
|
||||
| 原方法签名 | 新方法签名 | 实现逻辑 |
|
||||
|---------|---------|---------|
|
||||
| `Entity findById(Integer id)` | `Vo findById(Integer id)` | 1. 调用repository.findById(id)
|
||||
#### IEntityService<Model>实现方法:
|
||||
|
||||
| 方法签名 | 实现逻辑 |
|
||||
|---------|---------|
|
||||
| `Model getById(Integer id)` | 1. 调用repository.findById(id)
|
||||
2. 直接返回实体对象(不做缓存) |
|
||||
| `Page<Model> findAll(Specification<Model> spec, Pageable pageable)` | 1. 构建查询条件
|
||||
2. 调用repository.findAll(spec, pageable)
|
||||
3. 返回包含实体对象的Page |
|
||||
| `void delete(Model entity)` | 1. 直接调用repository.delete(entity) |
|
||||
| `Model save(Model entity)` | 1. 直接调用repository.save(entity)
|
||||
2. 清除相关缓存
|
||||
3. 返回实体对象 |
|
||||
|
||||
#### QueryService<Vo>实现方法:
|
||||
|
||||
| 方法签名 | 实现逻辑 |
|
||||
|---------|---------|
|
||||
| `Vo findById(Integer id)` | 1. 调用repository.findById(id)
|
||||
2. 将查询到的实体对象转换为VO对象
|
||||
3. 返回VO对象 |
|
||||
| `Page<Entity> findAll(Specification<Entity> spec, Pageable pageable)` | `Page<Vo> findAll(Specification<Vo> spec, Pageable pageable)` | 1. 将VO的Specification转换为Entity的Specification
|
||||
3. 使用@Cacheable注解缓存VO对象
|
||||
4. 返回VO对象 |
|
||||
| `Page<Vo> findAll(JsonNode paramsNode, Pageable pageable)` | 1. 构建查询条件
|
||||
2. 调用repository.findAll(spec, pageable)
|
||||
3. 将查询结果中的每个实体对象转换为VO对象
|
||||
4. 返回包含VO对象的Page |
|
||||
| `Specification<Entity> getSpecification(String searchText)` | `Specification<Vo> getSpecification(String searchText)` | 1. 构建基于Entity的Specification
|
||||
2. 封装或转换为基于Vo的Specification(可能需要特殊处理) |
|
||||
| `void delete(Entity entity)` | `void delete(Vo entity)` | 1. 将VO对象转换为实体对象
|
||||
2. 调用repository.delete(entity) |
|
||||
| `Entity save(Entity entity)` | `Vo save(Vo entity)` | 1. 将VO对象转换为实体对象
|
||||
2. 调用repository.save(entity)
|
||||
3. 将保存结果转换为VO对象
|
||||
4. 返回VO对象 |
|
||||
|
||||
## 5. 数据流向图
|
||||
|
||||
@@ -249,36 +220,17 @@ flowchart TD
|
||||
subgraph 服务请求处理流程
|
||||
B[Controller接收请求
|
||||
调用Service方法] --> C[Service方法处理
|
||||
接收VO参数] --> D{检查Redis缓存
|
||||
接收参数] --> D{检查Redis缓存
|
||||
中是否存在VO对象}
|
||||
D -->|存在| D1[直接返回缓存中的VO对象]
|
||||
D -->|不存在| D2[VO转换为Entity
|
||||
准备数据操作]
|
||||
D2 --> E[调用Repository
|
||||
执行数据操作] --> F[Repository操作数据库
|
||||
D -->|不存在| D2[准备数据操作
|
||||
调用Repository] --> E[Repository操作数据库
|
||||
返回Entity结果]
|
||||
F --> G[Entity转换为VO
|
||||
E --> F[Entity转换为VO
|
||||
准备响应数据]
|
||||
G --> H[将VO对象存入Redis缓存] --> I[Service返回VO
|
||||
F --> G[将VO对象存入Redis缓存] --> H[Service返回VO
|
||||
Controller组装响应]
|
||||
D1 --> I
|
||||
end
|
||||
|
||||
subgraph WebSocket请求处理流程
|
||||
W1[WebSocket客户端请求
|
||||
消息传递] --> W2[WebSocketServerHandler
|
||||
接收消息] --> W3[WebSocketServerTaskManager
|
||||
处理任务] --> W4[WebSocketServerCallbackManager
|
||||
反射调用Service方法] --> W5{检查Redis缓存
|
||||
中是否存在VO对象}
|
||||
W5 -->|存在| W6[直接返回缓存中的VO对象]
|
||||
W5 -->|不存在| W7[Service处理请求
|
||||
进行数据转换] --> W8[Entity转换为VO
|
||||
准备响应数据] --> W9[WebSocketServerCallbackManager
|
||||
处理VO响应] --> W10[WebSocketServerHandler
|
||||
发送响应消息] --> W11[WebSocket客户端接收
|
||||
VO响应数据]
|
||||
W6 --> W9
|
||||
D1 --> H
|
||||
end
|
||||
|
||||
subgraph 数据转换流程
|
||||
@@ -287,18 +239,14 @@ flowchart TD
|
||||
L -->|属性映射| K
|
||||
end
|
||||
|
||||
C --> K
|
||||
D2 --> K
|
||||
F --> L
|
||||
G --> K
|
||||
W4 --> C
|
||||
W7 --> G
|
||||
W9 --> K
|
||||
C -->|查询操作| D
|
||||
C -->|更新/删除操作| D2
|
||||
D2 --> L
|
||||
E --> L
|
||||
F --> K
|
||||
|
||||
style H fill:#bbf,stroke:#333,stroke-width:2px
|
||||
style G fill:#bbf,stroke:#333,stroke-width:2px
|
||||
style D fill:#bbf,stroke:#333,stroke-width:2px
|
||||
style W5 fill:#fbb,stroke:#333,stroke-width:2px
|
||||
style W9 fill:#fbb,stroke:#333,stroke-width:2px
|
||||
```
|
||||
|
||||
## 6. 异常处理策略
|
||||
|
||||
Reference in New Issue
Block a user