• JoinPoint




    import
    org.aspectj.lang.reflect.SourceLocation; public interface JoinPoint { String toString(); //连接点所在位置的相关信息 String toShortString(); //连接点所在位置的简短相关信息 String toLongString(); //连接点所在位置的全部相关信息 Object getThis(); //返回AOP代理对象 Object getTarget(); //返回目标对象 Object[] getArgs(); //返回被通知方法参数列表 Signature getSignature(); //返回当前连接点签名 SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置 String getKind(); //连接点类型 StaticPart getStaticPart(); //返回连接点静态部分 } public interface ProceedingJoinPoint extends JoinPoint { public Object proceed() throws Throwable; public Object proceed(Object[] args) throws Throwable; }
    public interface StaticPart {  
       Signature getSignature();    //返回当前连接点签名  
       String getKind();          //连接点类型  
       int getId();               //唯一标识  
       String toString();         //连接点所在位置的相关信息  
       String toShortString();     //连接点所在位置的简短相关信息  
       String toLongString();     //连接点所在位置的全部相关信息  
       }  

    环绕通知 ProceedingJoinPoint 执行proceed方法的作用是让目标方法执行,这也是环绕通知和前置、后置通知方法的一个最大区别。

     Proceedingjoinpoint 继承了 JoinPoint 。是在JoinPoint的基础上暴露出 proceed 这个方法。proceed很重要,这个是aop代理链执行的方法。

     暴露出这个方法,就能支持 aop:around 这种切面(而其他的几种切面只需要用到JoinPoint,这跟切面类型有关), 能决定是否走代理链还是走自己拦截的其他逻辑。建议看一下 JdkDynamicAopProxy的invoke方法,了解一下代理链的执行原理。

    典型的用法如下:
    public Object around(ProceedingJoinPoint point) throws Throwable {
            Signature signature = point.getSignature();        // AopUtils.getTargetClass(point.getTarget())获取原始对象,例如对于Mapper而言,它获取的是具体代理的Mapper如com.b.mapper.DefaultDsMapper(如果前者继承了后者的话)而不是定义该方法的Mapper如com.b.base.BaseMapper<Info, InfoExample, InfoKey>,如下图
            Type[] types = AopUtils.getTargetClass(point.getTarget()).getGenericInterfaces(); // getGenericInterfaces方法能够获取类/接口实现的所有接口
            Annotation nologgingAnno = ((Class)types[0]).getAnnotation(Nologging.class); // type是所有类型的父接口
            MethodSignature methodSignature = (MethodSignature)signature;
            Method targetMethod = methodSignature.getMethod();

    转:https://blog.csdn.net/wuzhiwei549/article/details/79789853

  • 相关阅读:
    rsync命令详解
    Android Studio手动下载配置Gradle的方法
    "standard,singleTop,singleTask,singleInstance"-Android启动模式
    "Activity" 总结
    Android应用开发完全退出程序的通用方法
    SVN服务器使用(一)
    使用PyInstaller打包Python程序
    py2exe把python程序转换exe
    python 下载安装setuptools及pip应用
    Python的库和资源(转)
  • 原文地址:https://www.cnblogs.com/jthr/p/14047818.html
Copyright © 2020-2023  润新知