Spring AOP 原理

💖 AOP 介绍

AOP,也就是 Aspect-oriented Programming,译为面向切面编程

简单点说,就是把一些业务逻辑中的相同代码抽取到一个独立的模块中,让业务逻辑更加清爽。

在这里插入图片描述
举个例子,假如我们现在需要在业务代码开始前进行参数校验,在结束后打印日志,该怎么办呢?

我们可以把日志记录数据校验这两个功能抽取出来,形成一个切面,然后在业务代码中引入这个切面,这样就可以实现业务逻辑和通用逻辑的分离。

在这里插入图片描述
业务代码不再关心这些通用逻辑,只需要关心自己的业务实现,这样就实现了业务逻辑和通用逻辑的分离。


💖 AOP 的核心概念

  • 切面(Aspect)
    表示增强的功能. 交叉业务逻辑。常见的切面: 日志 事务 统计信息 参数检查

  • 连接点(Join Point)
    在程序执行过程中的某个特定点,例如方法调用、异常抛出等

  • 通知(Advice)
    通知就是切面在某个连接点要执行的操作

  • 切点(Pointcut)
    一个切点是一个表达式,它用来匹配哪些连接点需要被切面所增强。切点可以通过注解、正则表达式、逻辑运算等方式来定义。比如 execution(* com.xyz.service..*(..))匹配

  • 织入(Weaving)
    将切面应用到目标对象中的过程,可以在编译时、加载时或运行时进行。


public class Main
{
	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 连接点
			System.out.println(e.getMessage());
		} finally
		{
			// JoinPoint 连接点
		}
	}
	/*
	1. 接点(JoinPoint)描述的是位置
	2. 切点(Pointcut)本质上就是方法(真正织入切面的那个方法叫做切点)
	3. 知(Advice),通知又叫做增强。就是具体增强的那个代码。
		例如:具体的事务代码,日志代码,安全代码,统计时长的代码
		具体的这个代码是通知
		通知描述的是代码
	4. 切面:切点 + 通知
	*/
}

在这里插入图片描述


切点表达式
切点表达式用来定义通知(Advice)往哪些方法上切入。
切入点表达式语法格式:

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

访问控制权限修饰符:

  • 可选项。
  • 没写,就是4个权限都包括。
  • 写public就表示只包括公开的方法。
    返回值类型:
  • 必填项。
  • * 表示返回值类型任意。

全限定类名:

  • 可选项。
  • 两个点“…”代表当前包以及子包下的所有类。
  • 省略时表示所有的类。

方法名:

  • 必填项。
  • *表示所有方法。
  • set*表示所有的set方法。

形式参数列表:

  • 必填项
  • () 表示没有参数的方法
  • (…) 参数类型和个数随意的方法
  • (*) 只有一个参数的方法
  • (*, String) 第一个参数类型随意,第二个参数是String的。

异常:

  • 可选项。
  • 省略时表示任意异常类型。

在这里插入图片描述

💖 AOP 的五种通知类型

  • 前置通知(Before)
  • 后置通知(After Returning)
  • 异常通知(After Throwing)
  • 最终通知(After / Finally)
  • 环绕通知(Around)
    前四种通知都是在目标方法的前后执行,而环绕通知可以控制目标方法的执行过程

💖 AOP 的技术实现

1. 静态代理

通过 AOP 框架提供的命令进行编译,从而在编译阶段生成 AOP 代理类。这种方式也被称为编译时增强。静态代理包括编译时编织和类加载时编织两种方式。

2. 动态代理

👨‍🏫 动态代理参考地址
在运行时在内存中“临时”生成 AOP 动态代理类,因此也被称为运行时增强。动态代理主要有两种实现方式:

  • JDK 动态代理:JDK 动态代理要求被代理的类必须实现一个接口,它通过反射来接收被代理的类,并使用 InvocationHandler 接口和 Proxy 类实现代理。
  • CGLIB 动态代理:CGLIB 则是一个代码生成的类库,它可以在运行时动态地生成某个类的子类,通过继承的方式实现代理。如果目标类没有实现接口,Spring AOP 会选择使用 CGLIB 来动态代理目标类。

👨‍🏫 参考地址

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值