Spring:AOP
动态代理编程【Aspect Oriented Programming, AOP,面向切面编程】
-
@Trancactional:事务的底层逻辑就是AOP
-
概念【动态代理,最后IOC自动注入的是代理对象】:
-
连接点:被aop获取的方法的相关信息;
-
通知:aop函数,扩展逻辑;
-
切入点:aop方法获取的匹配条件;
-
切面:通知所在的类;
-
目标对象:方法
-
-
通知类型【函数的逻辑类型】,对原有方法进行扩展【类似于拦截器】:
- @Around:环绕通知
- 运行方法开始前逻辑;
- 运行原始方法;
- 运行方法后的逻辑;
- @Before:前置通知;
- @After:后置通知,无论是否有异常都会执行;
- @AfterReturning:返回后通知,有异常不会执行;
- @AfterThrowing:异常通知,异常发生后执行;
- @Around:环绕通知
-
通知顺序【通知的多层嵌套通知】:
- 对于相同类型的通知,通知通知顺序和类名【字符串】顺序有关;
- 前置通知,呈递增【字符串】形式执行;
- 后置通知,呈递减【字符串】形式执行【为了和前置形成对照】;
- 也可也通过注解@Order(数字)来控制顺序,和字符串排序相同;
- 对于相同类型的通知,通知通知顺序和类名【字符串】顺序有关;
-
原始方法的获取或者定位;
- 切入点表达式:@Pointcut("切入点表达式");
- 根据方法的签名:execution(...):
- 语法:execution(访问修饰符? 返回值 包名.类名.?方法名(方法参数) throws 异常?)【这就是在函数头上加入包名和类名】;
- ?可以省略:访问修饰符,包名.类名【就是方法声明了】,throws 异常;【返回值 + 方法名 + 参数类型】
- execution(返回值 包名.类名(方法参数);
- 通配符号:
- *:可以匹配任意一个参数;
- ··:可以匹配任意个连续的任意符号;
- 切入点表达式,可以加入逻辑运算符;
- 采用通过接口进行描述,方便扩展;
- 根据注解@annotation(...)
- 用于匹配有特定注解的方法;
- @Pointcut("@annotation(自定义注解类的包名.类名)"),会自动识别标注了注解类的方法;
- 根据方法的签名:execution(...):
- Spring中使用JoinPointdu抽象了连接点:
- @Aound的通知,获取连接点,ProceedingJoinPoint;
- 其他四类:JoinPoint【ProceedingJoinPoint是JoinPoint子类】;
- 能够获取:类名,方法名,方法传入参数,方法返回值,
- 切入点表达式:@Pointcut("切入点表达式");

浙公网安备 33010602011771号