spring>aop
推荐文章: https://blog.csdn.net/dilixinxixitong2009/article/details/78781851 https://www.cnblogs.com/jiaweit/p/9986390.html
关注我下一篇,自定义注解玩aop 老生常谈: 切面: AOP核心概念 1、横切关注点 对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点 2、切面(aspect) 类是对物体特征的抽象,切面就是对横切关注点的抽象 3、连接点(joinpoint) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器 4、切入点(pointcut) 对连接点进行拦截的定义 5、通知(advice) 所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类 6、目标对象 代理的目标对象 7、织入(weave) 将切面应用到目标对象并导致代理对象创建的过程 8、引入(introduction) 在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段 以上是来自推荐文章 个人总结3步: 1,切面 2.切点 3.值入 至于什么通知,对象连接点都是上面三个步骤里面的细节 I》》》》先考虑切面能干什么? a.记录日志 a鉴权 c利用织入处理业务 d设置order级别切换数据源 II》》》切面都知道了,获取切面传值咋搞呢? a @Pointcut("execution(* com.example.demo.controller.*.asserb(..))&&args(index),argNames=index!execution(* com.example.demo.instageconfig.*.asserb(..))") 利用如上使用&&或者||,传入参数&&args(index),argNames=index 为什么这样,老司机不用说,新司机请去看源码 b JoinPoint joinPoint.getArgs()获取入参,注意这里是一个数组 代码案例如下:log.info("前置执行:getArgs:"+ JSON.toJSONString(joinPoint.getArgs())); 2021-06-26 17:25:05.541 INFO 10328 --- [nio-8080-exec-1] c.example.demo.instragedemo.InstrageAop : 前置执行:getArgs:[3],看到没这里是一个数组里面是个3,根据自己的业务去处理 个人案例如下:
// JoinPoint joinPoint:
// Signature getSignature(); 获取封装了署名信息的对象,在该对象中可以获取到目标方法名,所属类的Class等信息
// Object[] getArgs(); 获取传入目标方法的参数对象
// Object getTarget(); 获取被代理的对象
// Object getThis(); 获取代理对象
// 补充说明:@Around不要与after,before一起用会有冲突
// ProceedingJoinPoint:
// ProceedingJoinPoint对象是JoinPoint的子接口,该对象只用在@Around的切面方法中,
// 添加了
// Object proceed() throws Throwable //执行目标方法
// Object proceed(Object[] var1) throws Throwable //传入的新的参数去执行目标方法
ProceedingJoinPoint是JoinPoint 子类也是个接口
ProceedingJoinPoint源码如下:
package org.aspectj.lang;
import org.aspectj.runtime.internal.AroundClosure;
public interface ProceedingJoinPoint extends JoinPoint {
//非牛逼大牛请勿使用
void set$AroundClosure(AroundClosure arc);
//非牛逼大牛请勿使用
default void stack$AroundClosure(AroundClosure arc) {
throw new UnsupportedOperationException();
}
//此方法是调用目标方法时使用,就像汽车手动挡一个,想开那个档自己来
public Object proceed() throws Throwable;
//此方法是对目标方法添加参数时使用
public Object proceed(Object[] args) throws Throwable;
}
使用如下:我这里后置没有把结果返回,因为设置了void,如果业务需要,可以把“我后年要生孩子”拿去处理


最后呢介绍下joinPoint除了获取参数还能干啥:

本文来自博客园,作者:余生请多指教ANT,转载请注明原文链接:https://www.cnblogs.com/wangbiaohistory/p/14937135.html

浙公网安备 33010602011771号