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除了获取参数还能干啥:

 

一点点学习,一丝丝进步。不懈怠,才不会被时代淘汰
原文地址:https://www.cnblogs.com/wangbiaohistory/p/14937135.html