type
status
date
slug
summary
tags
category
icon
password
1.硬编码和静态代理
静态代理。
编码时期间就决定好了代理的关系
定义,代理对象,是目标对象的接口的子类型,代理对象本身并不是目标对象,而是将目标对象作为自己的属性。
优点:同一种类型的所有对象都能代理
缺点,范围太小了,只能负责部分接口代理功能
2.动态代理
2.1动态代理实例
动态代理。
运行期间才决定好了代理关系(拦截器:拦截所有)
定义:目标对象在执行期间会被动态拦截,插入指定逻辑
优点:可以代理世间万物
缺点,Jdk动态代理;强制要求,目标对象必有接口。代理的也只是接口规定的方法
2.2动态代理加日志
2.3日志工具类
3.AOP

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


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.多切面
多切面执行顺序

那为什么权限先执行呢?因为权限Auth和Log是根据首字母,如果要该优先级,用@Order(number)在Aspect的类上标注
10.环绕通知
可以控制目标方法是否执行,修改目标方法参数、执行结果等。
环绕通知的小坑:
吃掉异常还要抛出异常,不然外层的感知不到里面出现异常了
