02-详解SpringAOP 面向切面编程

news2025/5/28 3:03:19

面向切面编程

AOP思想

Spring的IoC容器可以使软件组件松耦合,Spring的AOP则可以让你能够捕捉系统中经常使用的功能并把它转化成组件

Spring的AOP的实现底层可以在JDK动态代理 + CGLIB动态代理两种动态代理中灵活切换,当前也可以通过Spring的配置强制使用CGLIB动态代理

  • 如果代理的是接口默认使用的是JDK动态代理
  • 如果代理的是某个类并且这个类没有实现接口使用的就是CGLIB动态代理

交叉业务(切面)是指在在每一个业务处理过程中掺杂的一些通用且固定不变的非业务逻辑代码,如日志、事务管理、安全监控相关的逻辑代码

  • 交叉业务代码在多个业务流程中反复出现代码没有得到复用,修改这些交叉业务代码的话就需要修改多处
  • 程序员在编写核心业务代码的同时还需要处理这些交叉业务是没有必要的

AOP(Aspect Oriented Programming)又叫面向切面编程或面向方面编程,AOP思想是一种基于OOP基础之上新的编程思想

  • 将与核心业务无关的代码独立的抽取出来形成一个独立的组件,然后以横向交叉的方式应用到业务当中的过程被称为AOP
  • 优点: 代码复用性增强,代码易维护,使开发者更关注业务逻辑

在这里插入图片描述

AOP的七大术语

AOP的七大术语

名称描述位置
连接点(Joinpoint)在程序的整个执行流程中可以织入切面的位置方法的执行前后,异常抛出之后
切点(Pointcut)在程序执行流程中被织入切面的方法(包含核心业务代码),一个切点对应多个连接点方法本身
通知(Advice)又叫增强具体要织入的增强代码(事务,日志,安全相关的代码),通知都以方法(包含交叉业务代码)的形式出现在某个连接点上前置通知 : 放在在目标方法之前的连接点上的通知
后置通知:放在在目标方法之后的连接点上的通知
环绕通知:既放在目标方法前又放在目标方法后的连接点上的通知
异常通知:在目标方法抛出异常之后,放在catch语句块中连接点上的通知
最终通知: 放在finally语句块中连接点上的通知
切面(Aspect)切点(核心代码) + 通知(增强代码)就是切面(完整的业务逻辑)
织入 Weaving把通知应用到目标对象上的过程
代理对象 Proxy一个目标对象被织入通知后产生的新对象
目标对象 Target被织入通知的对象
public class UserService{
    public void do1(){
        System.out.println("do 1");
    }
    public void do2(){
        System.out.println("do 2");
    }
    public void do3(){
        System.out.println("do 3");
    }
    public void do4(){
        System.out.println("do 4");
    }
    public void do5(){
        System.out.println("do 5");
    }
    // 核心业务方法
    public void service(){
        try{
            //连接点 Joinpoint
            do1();//切点  Pointcut
            //连接点 Joinpoint
            do2();//切点  Pointcut
            //连接点 Joinpoint
            do3();//切点  Pointcut
            //连接点 Joinpoint
            do5();//切点  Pointcut
            //连接点 Joinpoint
        }
        catch(Exception e){
            //连接点 Joinpoint
        }finally{}
        	//连接点 Joinpoint
    }
}

在这里插入图片描述

切点(方法)表达式

切点表达式用来定义匹配规则,指定通知往哪些方法上切入

切入表达式的语法格式: execution([访问控制权限修饰符] 返回值类型 全限定类名.方法名(形式参数列表) [异常])

  • 访问控制权限修饰符: 省略表示4个权限都包括,如public表示只包括公开的方法
  • 返回值类型: * 表示返回值类型任意
  • 全限定类名.方法名: 省略类名表示所有的类,..表示代表当前包以及子包下的所有类,* 表示所有方法
  • 形式参数列表: ()表示没有参数,(..)表示参数类型和个数任意,(*)表示只有一个参数,(*, String)表示第一个参数类型随意,第二个参数类型是String的
  • 异常: 省略表示任意异常类型
符号使用场景描述
*在访问修饰符中不能使用 *
在全类名中一个 * 可以匹配一个或者多个字符,但只能匹配一层路径
在方法名中 * 表示匹配任意方法
在形参列表中 一个 * 匹配任意一个的参数类型
..在形参列表中匹配任意数量、任意类型的参数
在全限定类名中匹配任意多层路径
`&&、
//service包下所有的类中以delete开始的所有方法,参数类型参数类型和个数任意
execution(public * com.powernode.mall.service.*.delete*(..))
    
//mall包下所有的类中的所有方法
execution(* com.powernode.mall..*(..))   
    
// 所有类的所有方法
execution(* *(..))

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序案例3-1 比较数字

文章目录 一、运行效果二、知识储备(一)Page()函数(二)数据绑定(三)事件绑定(四)事件对象(五)this关键字(六)setData()方法&#xff0…

GitHub黑市曝光,高档刷星6元一颗,最奇葩开源项目97%都是刷的

​梦晨 克雷西 发自 凹非寺 量子位 | 公众号 QbitAI 在黑市买GitHub星星多少钱? 最贵的高达6元一颗。 有创业者Yassin Eldeeeb自掏腰包测试了一把。他足足花20欧元(约156人民币),只买到25颗“高级星星”。 没错,在黑…

最近非常火的电子木鱼流量主小程序源码系统 带完整搭建教程

在当今数字化时代,人们对于休闲娱乐的需求越来越高。近年来,一种结合了传统文化和现代科技的新型休闲娱乐方式——电子木鱼,迅速在年轻人群中流行开来。电子木鱼流量主小程序源码系统的出现,为这种新型娱乐方式提供了更加便捷的途…

在直播系统中使用RTSP协议传递视频

目录 概述 1、环境准备 2、拉流URL地址 3、导播软件取流 (1)OBS中拉取RTSP流 (2)芯象中拉取RTSP流 (3)vMix中拉取RTSP流 写在最后 概述 提到RTSP协议,很容易想到RTMP协议,它…

【Linux】进程状态详解

Halo,这里是Ppeua。平时主要更新C语言,C,数据结构算法…感兴趣就关注我吧!你定不会失望。 本篇导航 0. 五状态进程模型1. 运行 >> R (running)2. 浅度睡眠 >> S (sleeping)3. 深度睡眠 >> D (disk sleep)4. 暂…

skynet学习笔记01— skynet开发环境搭建(超详细)与第一个skynet程序

00、参考资料 https://blog.csdn.net/qq769651718/category_7480207.html 01、前置准备 开发所在目录 mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ pwd /home/mhzzj/work/skynetStudy前置准备 mhzzjmhzzj-virtual-machine:~/work/skynetStudy$ sudo apt install lua5…

注册电气工程师证书挂靠有风险吗?考试难度很高是吗?前景怎么样

一.先说证书挂靠问题,毫无疑问,有风险,远的不说咱说说近的, 比如下面这张图 从上面这张图可以看出来,哪怕是2023,还有陆陆续续的人因为挂靠的问题被处罚,所以我的建议是能不挂就不挂&#xff0c…

qt opengl 绘制点、线、三角形、多边形(二)

文章目录 一、相关宏定义参数二、代码及示例图1. 点 LG_POINTS 0x00002. 线 GL_LINES 0x00013. 线 GL_LINE_LOOP 0x00024. GL_LINE_STRIP 0x00035. GL_TRIANGLES 0x00046. GL_TRIANGLE_STRIP 0x00057. GL_TRIANGLE_FAN 0x00068. GL_QUADS 0x00079. GL_QUAD_STRIP 0x000810. GL_…

第八章 Python类(面向对象编程)

系列文章目录 第一章 Python 基础知识 第二章 python 字符串处理 第三章 python 数据类型 第四章 python 运算符与流程控制 第五章 python 文件操作 第六章 python 函数 第七章 python 常用内建函数 第八章 python 类(面向对象编程) 第九章 python 异常处理 第十章 python 自定…

数票通批量开票小妙招,双11开票不用愁

每年双十一都是电商企业和财务“疯狂”的日子,随着疫情的回暖,消费者的消费能力蹭蹭上涨,商家的口袋盆满钵满,而财务的加班永无休止,批量开票成为财务人摆脱双十一加班的必备技能。 面对双十一狂欢,相信不少…

一文带你深入浅出Web的自动化测试工具Selenium【建议收藏】

文章目录 前言第01节 Selenium概述第02节 安装浏览器驱动(以Google为例)第03节 定位页面元素1. 打开指定页面2. id 定位3. name 定位4. class 定位5. tag 定位6. xpath 定位7. css 选择器8. link 定位9. 示例 有道翻译 第04节 浏览器控制1. 修改浏览器窗…

3D目标检测实战 | 图解KITTI数据集评价指标AP R40(附Python实现)

目录 1 准确率和召回率2 P-R曲线的绘制3 AP R11与AP R40标准4 实际案例 1 准确率和召回率 首先给出 T P TP TP、 F P FP FP、 F N FN FN、 T N TN TN的概念 真阳性 True Positive T P TP TP 预测为正(某类)且真值也为正(某类)的样本数,可视为 I o U > I o U t…

3Dmax Vary 渲染 玻璃 水 啤酒 的参数尝试

折射率: 空气折射率为1.0 水折射率一般 1.3 -1.4 ,啤酒折射率一般 1.4-1.55 玻璃折射率 一般 1.5-1.7 金刚石钻石 2.0 透明物体 密度越大 折射率越高。折射:同一束光在不同密度介质传播时发生的 光路弯折。如果密度不断发生变化&#…

C++常用格式化输出

在C语言中可以用printf以一定的格式打印字符,C当然也可以。 输入输出及命名空间还不太了解的小伙伴可以看一看C入门讲解第一篇。  在C中,可以用流操作符(stream manipulators)控制数据的输出格式,这些流操作符定义在2…

UE5——源码阅读——4——引擎预初始化

预初始化的开始处理和结束处理 将GEnginePreInitPreStartupScreenEndTime设置为平台的时间 ON_SCOPE_EXIT 这个就是在程序结束后执行一个Lambda,这个弘的目的是简化代码确保正确的时机正确的执行清理操作,降低因资源泄露而导致BUG的概率 处理延迟注册…

【GEE】基于GEE-Landsat8数据集地表温度反演(LST热度计算)

老样子,最近在做生态方面的项目,然后需要分析城市的热岛效应,想了想还是用GEE计算比较简单,直接下载影像太麻烦了。所以在网上看看了资料,踩了踩坑终于是将代码写出来了。秉承着取之于民、用之于民的想法,今…

如何解决msvcp140.dll文件丢失问题,msvcp140.dll丢失的解决方法

在使用电脑时,有时我们可能会遇到一些错误提示,比如“找不到msvcp140.dll文件”。这是因为某些程序需要依赖于msvcp140.dll文件才能正常运行。这个问题是可以解决的,大家不需要担心,而且其解决的方法是有很多种的,今天我们就来给大…

VS编译器中创建新源文件,自动添加----#define _CRT_SECURE_NO_WARNINGS 1

每次创建新的源文件时都需要添加比较麻烦,我们让每次创建时自动添加,步骤如下: 1、右键编译器--->属性--->目标(存放的是编译器的文件位置我们找到文件的位置) 2、如下步骤找到“newc file.cpp”文件&#xff0…

MySQL基础之约束、多表查询、事务【基础完结】

1 SQL约束 SQL约束是用于规定表中的数据规则,如果存在违反约束的数据行为,行为会被终止。 1.1 如何创建约束 • 在创建表的时候进行规定(create table)• 修改表的时候进行规定(alter table) 1.2 约束的…

设计师的宝库:5个供应免费素材的设计网站

今天给大家推荐五个设计素材网站,设计师看到就要码住,码住就是灵感。 即时设计 即时设计是一个可在线使用的设计资源网站,在网页中打开「即时设计」的官网,登录账号后即可使用即时设计提供的设计资源。 即时设计 - 可实时协作的…