02-详解SpringAOP 面向切面编程

news/2024/10/25 19:30:49/

面向切面编程

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{//连接点 Joinpointdo1();//切点  Pointcut//连接点 Joinpointdo2();//切点  Pointcut//连接点 Joinpointdo3();//切点  Pointcut//连接点 Joinpointdo5();//切点  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.ppmy.cn/news/1199986.html

相关文章

第十六章 反射与注解

目录 16.1 反射 1.使用getClass()方法 2.使用.class属性 3.使用class类的forname方法 16.1.2 访问成员变量 16.2 Annotation注解功能 16.2.1 定义Annotation类型 16.2.2 访问Annotation 信息 16.1 反射 1.class类 2.获取构造方法 3.获取成…

keil代码编辑区配色方案

第一步找到global.prop文件打开 ### 第二步复制下面的文本替换global.prop的内容,保存。 # properties for all file types indent.automatic1 virtual.space0 view.whitespace0 view.endofline0 code.page936 caretline.visible1 highlight.matchingbraces1 prin…

Ubuntu下Anaconda安装

Ubuntu下Anaconda安装 进入anaconda官网 https://www.anaconda.com/ 下载Linux64位版本; 将下载好的".sh"文件放入虚拟机中; 运行指令sudo bash Anaconda3-2023.09-0-Linux-x86_64.sh 此后会自动加载安装程序,中途会停止两次&am…

MR混合现实情景实训教学系统在外语课堂中的应用演示

MR混合现实情景实训教学系统是一种将虚拟现实(VR)和增强现实(AR)技术相结合的先进教学工具。它能够为学生提供身临其境的学习环境,使学生能够在模拟的真实场景中进行外语学习。这种教学系统不仅能够帮助学生在实践中提…

应用软件安全编程--05预防 XML 注入

如果用户有能力使用结构化XML 文档作为输入&#xff0c;那么他能够通过在数据字段中插入 XML 标签来 重写这个 XML 文档的内容。 XML 解析器会将这些标签按照正常标签进行解析。下面是一段在线商 店的 XML 代码&#xff0c;主要用于查询后台数据库。 <item)<descri…

操作系统——逻辑结构 vs 物理结构(王道视频 p63)

1.总体概述&#xff1a; 其实&#xff0c;就是讲述了一件事情&#xff0c; 文件内的内容结构——其实完全由用户定义&#xff0c;在操作系统看来&#xff0c;就是“bit串” 文件的物理结构&#xff0c;就是说这个“bit串”整体在操作系统的控制下怎么存储在外存中

flutter项目引入本地静态图片资源并展示

想要在flutter中引入静态资源&#xff0c;需要配置pubspec.yaml&#xff0c;将本地的静态资源添加到assets下面&#xff1a; 然后在flutter引入这些静态资源&#xff1a; Image.asset("images/squick.png") 就可以在app中看到这个图片了&#xff1a; 也可以使用网…

软考 系统架构设计师系列知识点之系统架构评估(8)

接前一篇文章&#xff1a;软考 系统架构设计师系列知识点之系统架构评估&#xff08;7&#xff09; 所属章节&#xff1a; 第8章. 系统质量属性与架构评估 第2节. 系统架构评估 8.2.2 系统架构评估方法 相关试题 7. 架构权衡分析方法&#xff08;Architecture Tradeoff Analy…