1. 项目概述
在构建智能知识管理系统时,我们经常需要处理来自不同业务模块的文档变更。传统做法是为每种文档类型编写独立的处理逻辑,这不仅导致代码重复,还会随着业务扩展变得难以维护。本文将分享一个基于Spring AI的实战方案,通过工厂模式实现按消息类型动态派发向量化处理的能力。
这个方案的核心价值在于:
- 解耦消息接收与业务处理
- 支持运行时动态扩展新文档类型
- 统一异常处理和监控点
- 简化新业务类型的接入成本
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 核心设计思路
2.1 问题域分析
系统需要处理来自后台的各种文档变更消息,包括:
- 公告(notice)的增删改
- 学习资料(materials)的更新
- 其他业务文档的变更
每种文档类型有特定的:
- 数据存储位置(不同的数据库表)
- 内容处理逻辑(如分段策略)
- 向量化参数(如嵌入模型选择)
2.2 工厂模式选型
采用简单工厂模式而非抽象工厂,因为:
- 产品类型(IVectorService)单一且稳定
- 创建逻辑简单直接(type→实现映射)
- 不需要支持产品族的扩展
工厂类VectorServiceFactory的关键职责:
- 启动时自动注册所有IVectorService实现
- 运行时根据type快速查找对应服务
- 处理重复type定义的冲突检测
3. 关键技术实现
3.1 接口设计
IVectorService接口定义四个核心方法:
java复制public interface IVectorService {
// 处理新增文档
void add(String sourceId);
// 处理更新文档(默认delete+add实现)
default void update(String sourceId) {
delete(sourceId);
add(sourceId);
}
// 处理删除文档
void delete(String sourceId);
// 返回处理的文档类型标识
String type();
}
接口设计的考量:
- 使用default方法提供update默认实现
- sourceId统一使用String类型避免类型转换问题
- 单一职责原则:每个方法只做一件事
3.2 工厂实现
VectorServiceFactory的核心逻辑:
java复制@Component
public class VectorServiceFactory {
private final Map<String, IVectorService> registry = new ConcurrentHashMap<>();
@Autowired
public VectorServiceFactory(List<IVectorService> services) {
services.forEach(service -> {
String type = service.type();
if (registry.containsKey(type)) {
throw new IllegalStateException("重复的向量服务类型: " + type);
}
registry.put(type, service);
});
}
public IVectorService getService(String type) {
return Optional.ofNullable(registry.get(type))
.orElseThrow(() -> new IllegalAr
