基于Spring AOP自动填充字段

文章目录

    • Spring AOP简介
    • 例子

Spring AOP简介

Spring AOP(Aspect-Oriented Programming)是 Spring 框架中的一个核心模块,用于实现面向切面编程。它提供了一种将横切关注点(cross-cutting concerns)与核心业务逻辑分离的机制。

在传统的面向对象编程中,我们通常按照功能模块对代码进行划分,比如将业务逻辑、数据访问、日志记录等功能分别封装在不同的类中。然而,某些功能可能会跨越多个模块,比如日志记录、事务管理、权限控制等,这就是所谓的横切关注点。横切关注点的存在会导致代码的重复性增加,降低了代码的可维护性和灵活性。

Spring AOP 提供了一种通过将横切关注点从核心业务逻辑中抽离出来,并在特定的执行点(如方法调用、方法执行前后、异常抛出等)插入切面(Aspect)的方式来解决这个问题。通过 AOP,我们可以将这些横切关注点封装到独立的切面中,然后在需要的地方将这些切面织入到应用程序中,而无需修改核心业务逻辑的代码。

例子

当你需要在 Spring Boot 项目中实现公共字段自动填充时,可以使用 Spring AOP 来简化开发。以下是实现这一目标的步骤:

  1. 自定义注解 AutoFill

    • 创建一个自定义注解 AutoFill,用于标识需要进行公共字段自动填充的方法。这些方法通常是 Mapper 中涉及到插入更新的方法。
    • AutoFill 注解中,指定数据库操作类型(INSERT 或 UPDATE)。
  2. 自定义切面类 AutoFillAspect

    • 创建一个切面类 AutoFillAspect,用于统一拦截加入了 AutoFill 注解的方法。
    • 在切面中,通过反射为公共字段赋值。
    • 切面应该定义切入点拦截哪些请求)和通知对拦截的请求进行额外的代码补充与增强)。
  3. 在 Mapper 的方法上加入 AutoFill 注解

    • 在需要进行公共字段自动填充的 Mapper 方法上加入 AutoFill 注解。
    • 根据操作类型(INSERT 或 UPDATE),自动填充相应的字段值。

具体实现步骤如下:

  1. 自定义注解 AutoFill

    package com.hac.annotation;
    
    import com.hac.enumeration.OperationType;
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD)
    @Retention(RetentionPolicy.RUNTIME)
    public @interface AutoFill {
        OperationType value(); // 自己定义一个枚举类OperationType。数据库操作类型:UPDATE 或 INSERT
    }
    
  2. 自定义切面 AutoFillAspect

    package com.hac.aspect;
    
    import com.hac.annotation.AutoFill;
    import com.hac.constant.AutoFillConstant;
    import com.hac.context.BaseContext;
    import com.hac.enumeration.OperationType;
    import lombok.extern.slf4j.Slf4j;
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    import java.lang.reflect.Method;
    import java.time.LocalDateTime;
    // 切面类
    @Aspect
    @Component
    @Slf4j
    public class AutoFillAspect {
    	// 切点
    	// 这个切点表达式表示匹配 com.hac.mapper 包及其子包下的所有类的所有方法,并且这些方法被 @AutoFill 注解标注
    	// 当匹配到这些连接点时,与该切点关联的切面(Aspect)中定义的通知(Advice)就会被触发,执行相应的切面逻辑。
        @Pointcut("execution(* com.hac.mapper.*.*(..)) && @annotation(com.hac.annotation.AutoFill)")
        public void autoFillPointCut() {}
    	// 通知
        @Before("autoFillPointCut()")
        public void autoFill(JoinPoint joinPoint) { //  JoinPoint 是连接点,表示被拦截的方法。
            // 获取到当前被拦截的方法上的数据库操作类型
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            Method method = signature.getMethod();
            AutoFill autoFill = method.getAnnotation(AutoFill.class);
    
            // 根据操作类型为公共字段赋值
            if (autoFill.value() == OperationType.INSERT) {
                // 设置 createTime、updateTime、createUser、updateUser
                // ...
            } else if (autoFill.value() == OperationType.UPDATE) {
                // 设置 updateTime、updateUser
                // ...
            }
        }
    }
    
  3. 在 Mapper 的方法上加入 AutoFill 注解

    package com.hac.mapper;
    
    import com.hac.annotation.AutoFill;
    import com.hac.enumeration.OperationType;
    import org.apache.ibatis.annotations.Mapper;
    
    @Mapper
    public interface YourMapper {
        @AutoFill(OperationType.INSERT)
        void insertData(YourEntity entity);
    
        @AutoFill(OperationType.UPDATE)
        void updateData(YourEntity entity);
    }
    

基于 Spring AOP 实现公共字段自动填充,涉及到了一些 AOP 相关的术语。让我来详细解释一下这些术语:

  1. 切面类(Aspect)

    • 切面类,横切关注点的模块化
    • 在公共字段自动填充的场景中,切面负责拦截加入了 AutoFill 注解的方法,并在方法执行前后进行功能增强。
  2. 切点(PointCut)

    • 指定了哪些方法会被拦截【切点表达式定义了何时应该激活切面】
    • 在公共字段自动填充的流程中,切点是指加入了 AutoFill 注解的方法。
  3. 通知(Advice)

    • 通知是切面中的具体逻辑代码,用于在切点位置执行特定的操作。通知则指定了在那些点应该执行的操作。【拦截的方法执行前,先执行通知】
    • 在公共字段自动填充的场景中,通知负责根据操作类型(INSERT 或 UPDATE)为公共字段赋值。

总之,Spring AOP 提供了一种灵活且强大的方式来增强应用程序的功能,同时保持代码的整洁和可维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/602417.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

2024年数维杯数学建模ABC题思路分析

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

[GESP样题 三级] 进制转换、春游、密码合规

B3849 [GESP样题 三级] 进制转换 题目 小美刚刚学习了十六进制,她觉得很有趣,想到是不是还有更大的进制呢?在十六进制中,用 A 表示 10、F 表示 15。如果扩展到用 Z 表示 35,岂不是可以表示 36进制数了嘛!…

线程理论篇1

本章问题:什么是线程?线程的使用场景?什么是线程池?线程池是如何工作的?线程池共享了哪些资源?线程安全代码怎么写?什么是线程安全? 什么是线程? 线程是为了提高进程的效率。进程的地址空间中保存了cpu…

人工智能|推荐系统——工业界的推荐系统之序列建模

一、LastN特征 LastN:⽤户最近的𝑛 次交互(点击、点赞等)的物品ID。 对LastN物品ID做embedding,得到 𝑛 个向量。 把 𝑛 个向量取平均,作为⽤户的⼀种特征。 适⽤于召回双塔模型、…

【承装承修资质办理指南】广州市承装承修电力施工许可证四级资质申请所需材料详解

【承装承修资质办理指南】广州市承装承修电力施工许可证四级资质申请所需材料详解 广州市承装承修电力施工四级资质申请所需材料详解 在广州市申请承装承修电力施工四级资质,需要准备一系列详细的申请材料。这些材料不仅反映了企业的基本情况,还包括了企…

论文润色就用意得辑,打造学术精品新篇章

在学术的世界里,一篇优秀的论文如同璀璨的星辰,吸引着同行们的目光。然而,好的论文并非一蹴而就,它需要经过反复打磨、润色,才能焕发出夺目的光彩。在这个过程中,意得辑以其专业的服务、精湛的技巧&#xf…

四、Redis五种常用数据类型-List

List是Redis中的列表,按照插入顺序保存数据,插入顺序是什么样的,数据就怎么保存。可以添加一个元素到列表的头部(左边)或者尾部(右边)。一个列表最多可以包含232-1个元素(4294967295,每个列表超过40亿个元素)。是一种双向列表结构…

pytorch实现transformer(1): 模型介绍

文章目录 1. transformer 介绍2 Position Encoding2.1 位置编码原理2.2 代码实现3 Self-attention4 前馈层FFN5 残差连接与层归一化6 编码器和解码器结构1. transformer 介绍 Transformer 模型是由谷歌在 2017 年提出并首先应用于机器翻译的神经网络模型结构。机器翻译的目标是…

数字化校园的发展阶段

现代化技能虽然能很大程度上给人们日子带来很大的便利,可是许多新兴的科技被人们所接纳需求一个按部就班的进程。数字化学校也是如此。把高新科技引入到学校中,完全推翻之前的教育形式,关于学校来说也是一个巨大的挑战。所以数字化学校也不可…

怿星 × NI丨联合成功打造行业领先的L4自动驾驶数据回灌系统

怿星NI 联合成功打造行业领先的L4自动驾驶数据回灌系统(终版) 怿星与于NI(恩艾)公司联合打造的L4自动驾驶数据回灌系统,在支持多种数据同步回灌、实时模拟故障、高带宽数据传输的同时,具有视频链路扩展性高…

2024年钉钉群直播回放怎么保存

钉钉群直播回放下载插件我已经打包好了,有需要的自己下载一下 小白钉钉工具打包链接:百度网盘 请输入提取码 提取码:1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.再把逍遥一仙下载器解压出来&#xff0…

护眼台灯什么牌子好一点?五款专业护眼灯品牌排行分享

台灯作为家庭中不可或缺的桌面照明设备,在儿童和青少年的学习生活中扮演着至关重要的角色。对于这个年龄段的孩子来说,台灯的选择尤为关键,因为不恰当的照明可能对他们娇嫩的视力造成损害。护眼台灯什么牌子好一点?家长们在挑选台…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限,您可以使用SHOW GRANTS语句。这将列出用户的权限,包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令: SHOW GRANTS; 如果您想查看特定用户的权限,可以使用以下命令&…

delphi6直连redis服务(用lua脚本redis模块)

一、创建一个exe程序 创建一个exe程序,引用LuaRedis.pas单元(此单元自己封装的代码,目前主要封装了获取key和设置key/value功能),代码如下: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;type…

仅为娱乐,Python中如何重定义True为False?

在Python中,True 和 False 是内建的布尔常量,分别代表逻辑上的真和假。它们是不可变的,且在Python语言规范中具有特殊地位,不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的,这样的操作会…

​在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理

在缺少标注数据场景,SetFit 是解决的建模问题的一个有前途的解决方案,其由 Hugging Face 与Intel 实验室以及UKP Lab合作共同开发。作为一个高效的框架,SetFit 可用于对Sentence Transformers模型进行少样本微调。 SetFit 仅需很少的标注数据…

【JavaEE精炼宝库】计算机是如何工作的

目录 前言: 一、冯诺依曼体系 二、CPU基本知识 2.1 硬盘|内存|CPU关系: 2.2 指令: 2.3 CPU是如何执行指令的(重点): 2.4 小结: 三、编程语言 3.1 程序: 3.2 编程语言发展&a…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖,单号收益300左右,多开收益更多,轻松日入1000 可矩阵操作。 项目长期稳定,全自动挂机无需人工操作,小白,宝妈,想做副业的都可以。

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

翻译技巧早操练-(减译法)

hello,大家好,今天继续来学习翻译的技巧篇第二个-减译法。 往期回顾 翻译早操练-(增译法)-CSDN博客 减译法的目的就是为了译入语表达的通顺,如果原文的一些表达直接翻译到译入语即累赘还不合时宜,那么可以采…
最新文章