本文介绍了一套完整的区块链存证系统设计方案,旨在为业务系统提供零侵入、高可用的数据存证能力。通过 AOP 切面编程,业务代码只需添加 @BlockchainCertify 注解即可接入存证功能;采用策略模式支持多厂商 SDK(蚂蚁链、腾讯链、以太坊等);异步处理机制确保存证失败不影响原业务流程;完善的重试机制和状态监控保障系统稳定性。该方案可以封装为通用 Starter 组件,具备生产环境部署能力。
2025/8/24...大约 16 分钟
本文介绍了一套完整的区块链存证系统设计方案,旨在为业务系统提供零侵入、高可用的数据存证能力。通过 AOP 切面编程,业务代码只需添加 @BlockchainCertify 注解即可接入存证功能;采用策略模式支持多厂商 SDK(蚂蚁链、腾讯链、以太坊等);异步处理机制确保存证失败不影响原业务流程;完善的重试机制和状态监控保障系统稳定性。该方案可以封装为通用 Starter 组件,具备生产环境部署能力。
在现代 Web 应用开发中,请求处理流程的复杂性日益增长。从简单的 CRUD 操作到复杂的业务逻辑处理,每一个 HTTP 请求都需要经历多个处理层次:跨域处理、身份认证、权限校验、参数验证、业务逻辑执行、日志记录等。这些横切关注点的处理通常依赖于 Spring 框架提供的过滤器(Filter)和拦截器(Interceptor)机制。
然而,在实际开发过程中,我们经常遇到这样的困境:过滤器虽然执行得最早,但无法获取到控制器的详细信息;拦截器能够访问 HandlerMethod 等丰富的上下文,却无法将这些信息有效地传递回过滤器层进行统一处理。这种单向的信息流动限制了我们在架构设计上的灵活性。
SingleModel1.java
public class SingleModel1 {
//使用 static ,让类在加载时就直接创建好一个对象。
private static SingleModel1 obj = new SingleModel1();
//构造方法,私有之后,让外不能随便调用这里进行创建对象了。
private SingleModel1(){
}
//static 才能访问 static,public公共的供外调用
public static SingleModel1 getInstance() {
return obj;
}
}
例子:电子商务订单处理系统
1. 支付方式类(支付宝、微信支付、信用卡支付)
// 支付接口
interface PaymentMethod {
void pay(double amount);
}
// 支付宝支付
class Alipay implements PaymentMethod {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using Alipay.");
}
}
// 微信支付
class WeChatPay implements PaymentMethod {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using WeChat Pay.");
}
}
// 信用卡支付
class CreditCard implements PaymentMethod {
@Override
public void pay(double amount) {
System.out.println("Paying " + amount + " using Credit Card.");
}
}
// 共用的实体类和Mapper
@Data
public class UserFoot {
...
}
public interface UserFootMapper extends BaseMapper<UserFoot> {
}
// 方式1:直接继承IService方式
public interface UserFootService extends IService<UserFoot> {
// 自定义业务方法
List<UserFoot> getUserFootprints(Long userId);
}
@Service
public class UserFootServiceImpl extends ServiceImpl<UserFootMapper, UserFoot>
implements UserFootService {
// 可以注入其他Mapper或Service
@Autowired
private UserMapper userMapper;
@Override
public List<UserFoot> getUserFootprints(Long userId) {
// 直接使用继承的方法
return this.list(new LambdaQueryWrapper<UserFoot>()
.eq(UserFoot::getUserId, userId)
.orderByDesc(UserFoot::getCreateTime));
}
}
// 方式2:组合Dao方式
public class UserFootDao extends ServiceImpl<UserFootMapper, UserFoot> {
// 在Dao层封装数据库操作
public List<UserFoot> findByUserId(Long userId) {
return list(new LambdaQueryWrapper<UserFoot>()
.eq(UserFoot::getUserId, userId)
.orderByDesc(UserFoot::getCreateTime));
}
}
public interface UserFootService {
// 定义业务方法
List<UserFoot> getUserFootprints(Long userId);
}
@Service
public class UserFootServiceImpl implements UserFootService {
private final UserFootDao userFootDao;
private final UserMapper userMapper; // 同样可以注入其他依赖
@Autowired
public UserFootServiceImpl(UserFootDao userFootDao, UserMapper userMapper) {
this.userFootDao = userFootDao;
this.userMapper = userMapper;
}
@Override
public List<UserFoot> getUserFootprints(Long userId) {
// 通过dao进行数据操作
return userFootDao.findByUserId(userId);
}
}