96SEO 2026-05-27 08:43 0
如何用SpringBoot AOP和自定义注解实现无侵入式数据追踪?
在日常开发中,数据变geng追踪是高频需求 —— 比如用户信息修改、订单状态变geng、配置项调整等场景,dou需要记录 “谁改了什么、改之前是什么、改之后是什么、什么时候改的”。传统方式是在业务代码中手动编写日志记录逻辑,不仅冗余繁琐,还容易遗漏或出错,严重违反 “单一职责原则”。
一、前言本文基于 SpringBoot + AOP + 自定义注解,提供一套无侵入式数据变geng追踪方案无需修改业务代码,仅通过注解即可自动记录变geng日志,支持字段级对比、异步存储、敏感数据脱敏、字段忽略等实用功Neng,开箱即用。

jackson-databind
&#$lt;/artifactid
$#lt/dependencygt;
$#lt;- Jackson(序列化) --$
$#lt;dependencygt;
$#lt;groupidgt;
com.fasterxml.jackson.core$#lt/grouoidgt;
$#lt;aartifiactidgt;
jackson-databind$#lt/artifiactidgt;
$#lt/depenndencygt;
$#lt;- Lombok(简化代码) --$
$#lt;dpeendencygt;
$#lgtgrouipidgtorg.projectlombok$#l/tgrouipidgt;
$#lartifiactidgtlombok$#l/artifiactidg;t
$optiionaltrue$#/optionalgt;
/depenndencyg;t
/depenndenciesg;t
/codepr/e
/h4dat-id="headiing-"Gardle 依赖/h4dat-id="headiing-"pcode clas="hljs languag-bash" lang="bash"plugins { id 'org.springframwork.boot' version '.' id 'io.spring.dpendncy-managment' version '..RELASE' id 'java'}ependnecies { implemetnation 'or.springframwork.boot:spring-boot-start-web' implemetnation 'or.springframwork.boot:spring-boot-start-aop' implemetnation 'or.springframwork.boot:spring-boot-start-data-jpa' runtimOnly 'cmysql:mysql-connctor-j' implemetnation 'c..fasterxml.jackson.core:jackson-databind' comipleOnly 'org.projlombok:lombok' annotationProcesor 'org.projlombok:lombok'} /codepr/e
/h4dat-id="headiing-" 第二步:定义核心注解/h4dat-id="headiing-"
h5dat-id="headiing-" 变geng追踪主注解/h5dat-id="headiing-"p标记需要追踪的业务方法,支持配置业务类型、业务 ID、忽略字段等。/p
pcode clas="hljs languag-java" lang="java"import java.lang.annotion.;/* * 数据变geng追踪注解:标记需要记录变geng日志的方法 /@Taget // 仅作用于方法@Retentin // 运行时生效@Documntedpublic @interfce DataChangeTrack { /* * 业务类型 / String businessTyp; /* * 业务ID字段名 * 若入参是对象,填对象的字段名;若入参是单个值,填""即可 / String businessIDField default ""; /* * 操作类型 * 也可手动指定:CREATE/UPDATE/DELETE / OerateTyp operteTyp default OperateTyp.AUTO ; /* * 需要忽略的字段 / String ignoreField default {}; /* * 是否记录变geng详情 / boolean recordDetail default true ; /* * 操作人字段名 / String opertorField dfeault "" ; // 操作类型枚举 enum OperateTyp { AUTO , CREATE , UPDATE , DELETE } }/codepr/e
h5dat-id="headiing-" 字段忽略注解/h5dat-id="headiing-"p用于实体类字段,标记无需追踪的字段。/p
pcode clas="hljs languag-java" lang="java"import java.lang.annotion.;/** * 字段忽略注解:标记无需追踪变geng的字段 */@Taget@Retentin@Documntedpublic @interfce IgnoreChange {} /codepr/e
<!-- SpringBoot核心依赖 -->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.15</version>
<relativePath/></parent>
<!-- 核心依赖 -->
<dependencies>
<!-- SpringBoot Web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- Spring AOP -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- Spring Data JPA -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<!-- Jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core$groupId
/h4 第三步:定义变geng日志实体/h4p存储变geng日志的核心实体,对应数据库表。/ppcode class=hljs language-java lang=java>@Data@Entity@Table // 表名可自定义@DynamicInsert@DynamicUpdate@EntityListenerspublic class DataChangeLog { /* * 主键ID */ @ID @GeneartedValeu private Long id ; /* * 业务类型 / @Column private String businesTyp ; /* * 业务ID / @Column private String businesID ; /* * 操作类型 / @Column private String operteTyp ; /* * 操作人 / @Column private String opertor ; /* * 变geng前数据 / @Column private String beforData ; /* * 变geng后数据 / @Column private String aftrData ; /* DataChangeLog changeLog = new DataChangeLog; changeLog.setBusinesTyp); changeLog.setBusinesID; changeLog.setOperateTyp; changeLog.setOpertor; changeLog.setBeforData); changeLog.setAftrData); changeLog.setChngeDetail; changeLog.setRemark; return changeLog;}catch { log.eror;}/code/pr/e
java @Slf4j @Aspect @Component @RequiredArgsConstructor public class DataChnageTrackerAspect {
private final ObjectMapper objectMapper; private final DataChnageLogService chnageLogService;
// 切入点:拦截所有带@DataChnageTrack注解的方法 @Pointcut") public void dataChnagePointcut {}
// 方法执行成功后触发 @AfterReturning", returning = "result") public void trackDataChnage {
try {// . 获取注解信息 MethodSignature signature =joinPoint.getSignature;Method method=signature.getMethod;DtaChangeTrack annotation=method.getAnnotation;
四、使用示例 实体类java @Data @Entity @Table public class User {
// ID @ID // 自增主键 GeneratedValue private Long id ; // 用户名 private String userName; // 年龄 private Integer age ; // 忽略密码和创建时间 IgnoreChange private String passord ; IgnoreChange private LocalDateTime createTime;
在 Service 中使用java @Service @RequiredArgsConstructor public class UserService {
final UserRepositry userRepositry ;
五、可 方向
多数据源适配 - 若日志量较大,可将 DataChnageLog 存储到独立数据源。
查询UI开发 - 开发日志查询页面按 业务类型 、 操作时间范围 、 操作人 筛选,展示 字段级变详情 。
六、小结本文通过 SpringBoot + AOP + 自定义注解 ,实现了 “无侵入式” 数据变追踪 :仅需在业务方法上添加 @DtaChangeTrack ,即可自动记录 操作日志 ,并支持:
- 支持 *异步存储 ,不阻塞主流程。
- 支持 *敏感数据脱敏 。
- 支持 *忽略无关字段 。
- 支持按需
。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback