Spring中的面向切面编程
2025-4-5
| 2025-4-15
Words 2379Read Time 6 min
type
status
date
slug
summary
tags
category
icon
password

1.硬编码和静态代理

静态代理。 编码时期间就决定好了代理的关系 定义,代理对象,是目标对象的接口的子类型,代理对象本身并不是目标对象,而是将目标对象作为自己的属性。 优点:同一种类型的所有对象都能代理 缺点,范围太小了,只能负责部分接口代理功能

2.动态代理

2.1动态代理实例

动态代理。 运行期间才决定好了代理关系(拦截器:拦截所有) 定义:目标对象在执行期间会被动态拦截,插入指定逻辑 优点:可以代理世间万物 缺点,Jdk动态代理;强制要求,目标对象必有接口。代理的也只是接口规定的方法

2.2动态代理加日志

2.3日志工具类

3.AOP

notion image
————————————————
  1. 切面(Aspect):代表一个横切关注点的模块化。切面封装了影响多个类的行为。例如,日志记录、安全性检查等。
  1. 连接点(Joinpoint):程序执行过程中的某个特定位置,例如方法执行前后、异常抛出前后等。切面会在这些连接点处插入自己的行为。
  1. 通知(Advice):切面在特定连接点上执行的动作。根据执行时机的不同,通知可以分为前置通知、后置通知、环绕通知等。
  1. 切入点(Pointcut):定义了哪些连接点将会执行通知。它是切面与连接点的交集。
  1. 引入(Introduction):声明新的类型或方法,通常是向现有类添加新的行为或属性。
  1. 织入(Weaving):将切面代码插入到应用程序中,可以在编译时、加载时或运行时进行
 
Aop原理
//1、Spring会为每个被切面切入的组件创建代理对象(SpringCGLIB创建的代理对象,无视接口)。 //2、代理对象中保存了切面类里面所有通知方法构成的增强器链。 //3、目标方法执行时,会先去执行增强器链中拿到需要提前执行的通知方法去执行

4.编写切面类

5.切入点表达式

notion image
notion image

6.cglib和jdk区别

(1)JDK动态代理
基于接口:JDK动态代理要求被代理的类必须实现一个或多个接口。代理对象会实现这些接口,并将方法调用委托给目标对象。
如果类没有实现任何接口,JDK动态代理将无法工作。
(2)CGLIB动态代理
基于类:CGLIB动态代理通过生成目标类的子类来实现代理。它不要求目标类必须实现接口,因此它适用于没有实现接口的类。
CGLIB是通过继承方式创建代理类,因此不能代理final类或final方法,因为这些无法被继承和重写。

7.增强器链

切面中的所有通知方法其实就是增强器。他们被组织成一一个链路放到集合中。目标方法真正执行前后,会去增强器链中执行哪些需要提前执行的方法。
 
通知方法的执行顺序: 1、正常链路: 前置通知->目标方法->返回通知->后置通知 2、异常链路: 前置通知->目标方法->异常通知->后置通知
 

8.JoinPoint和@PointCut

前置通知的joinpoint用法
返回通知的joinpoint用法
异常通知的joinpoint用法
后置通知的joinpoint用法
@Pointcut用法

9.多切面

多切面执行顺序
notion image
那为什么权限先执行呢?因为权限Auth和Log是根据首字母,如果要该优先级,用@Order(number)在Aspect的类上标注

10.环绕通知

可以控制目标方法是否执行,修改目标方法参数、执行结果等。
环绕通知的小坑:
吃掉异常还要抛出异常,不然外层的感知不到里面出现异常了
notion image
  • 开发
  • 二维数组和稀疏数组相互转化Java-集合
    Loading...