现在AOP的场景越来越多,所以我们有必要理解下和AOP相关的一些概念和机制。
import org.aspectj.lang.reflect.SourceLocation;
public interface JoinPoint {  String toString();         //连接点所在位置的相关信息  String toShortString();     //连接点所在位置的简短相关信息  String toLongString();     //连接点所在位置的全部相关信息  Object getThis();         //返回AOP代理对象,也就是com.sun.proxy.$Proxy18Object getTarget();       //返回目标对象,一般我们都需要它或者(也就是定义方法的接口或类,为什么会是接口呢?这主要是在目标对象本身是动态代理的情况下,例如Mapper。所以返回的是定义方法的对象如aoptest.daoimpl.GoodDaoImpl或com.b.base.BaseMapper<T, E, PK>)Object[] getArgs();       //返回被通知方法参数列表  Signature getSignature();  //返回当前连接点签名  其getName()方法返回方法的FQN,如void aoptest.dao.GoodDao.delete()或com.b.base.BaseMapper.insert(T)(需要注意的是,很多时候我们定义了子类继承父类的时候,我们希望拿到基于子类的FQN,这直接可拿不到,要依赖于AopUtils.getTargetClass(point.getTarget())获取原始代理对象,下面会详细讲解)SourceLocation getSourceLocation();//返回连接点方法所在类文件中的位置  String getKind();        //连接点类型  StaticPart getStaticPart(); //返回连接点静态部分
  }  public interface ProceedingJoinPoint extends JoinPoint {  public Object proceed() throws Throwable;  public Object proceed(Object[] args) throws Throwable;  } 

JoinPoint.StaticPart:提供访问连接点的静态部分,如被通知方法签名、连接点类型等:
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();

现在来补充下Java中Type接口与Class类的区别联系。

package java.lang.reflect;/*** Type is the common superinterface for all types in the Java* programming language. These include raw types, parameterized types,* array types, type variables and primitive types.** @since 1.5*/
public interface Type {/*** Returns a string describing this type, including information* about any type parameters.** @implSpec The default implementation calls {@code toString}.** @return a string describing this type* @since 1.8*/default String getTypeName() {return toString();}
}

其主要的子类包括:

总结来说:

  • Type是一个接口。
  • Type是Java中所有类型的父接口,有一些子类,如上所示。
  • Type包括:raw type(原始类型,对应Class),parameterized types(参数化类型), array types(数组类型), type variables(类型变量) and primitive types(基本类型,对应Class).
  • Type是JDK1.5引入的,主要是为了泛型。

Type接口与Class类的区别联系

  • Type是Class的父接口。
  • Class是Type的子类。

转载于:https://www.cnblogs.com/zhjh256/p/10694165.html

AOP之proceedingjoinpoint和joinpoint区别(获取各对象备忘)、动态代理机制及获取原理代理对象、获取Mybatis Mapper接口原始对象...相关推荐

  1. linux程序实例获取,Linux命令备忘实例(4)——获取内容

    Linux中的所有内容都是以文件的方式表示的,会有很多需求需要我们获取文件的内容,查看部分或者全部内容.当然最直接方式就是使用编辑器打开文件查看,比如vim.vi.emacs等.这里主要关注的是she ...

  2. spring的aop的动态代理机制都有哪些_Spring学习(4):Spring AOP

    Spring AOP说明 AOP(Aspect Oriented Pragraming)面向切面编程,AOP采用横向抽取机制,取代了传统纵向继承体系的重复性代码(性能监视.事务管理.安全检查.缓存). ...

  3. spring aop中this和target区别

    前置条件 其实考虑这个问题的时候必须知道springaop 中存在2中代理,一个是jdk代理,一个cglib代理,并且这两者是有区别的,首先知道的一点,jdk代理是目标对象实现接口,也就是说jdk代码 ...

  4. SSM3==理解静态代理、动态代理Proxy.newProxyInstance、cglib代理==通过纯XML配置spring AOP,通过纯注解配置spring AOP

    静态代理: 为什么要代理?在不改动原代码的基础上,丰富调用某个方法时实现的功能. 比如service类中原本update只会更新,但是通过代理类加上了判断权限和输出时间的功能. 其实这些功能也可以写在 ...

  5. spring AOP原理分析:静态代理;JDK实现接口动态代理;Cglib继承父类代理;SpringAop的责任链模式调用

    普通静态代理 代理类和真实类都需要实现同一个接口 接口 package com.fchan.layui.represent.service; /*** 静态代理demo*/ public interf ...

  6. 从代理机制到Spring AOP

    这篇文章准备从Java的代理机制讲到Spring的AOP. 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通 ...

  7. java写一个外网访问的接口_【JAVA基础】一个案例搞懂类、对象、重载、封装、继承、多态、覆盖、抽象和接口概念及区别(中篇)...

    0 前言 初学JAVA时,总会对一些概念一知半解,相互混淆,不明其设计的用意,如类.对象.重载.封装.继承.多态.覆盖.抽象类.接口概念.为便于理解和巩固,本文将基于一个案例及其变形,展现各个概念的定 ...

  8. 从代理机制到Spring AOP,这篇给你安排的明明白白的

    这篇文章准备从Java的代理机制讲到Spring的AOP. 1.代理模式 代理模式是很常见的一种设计模式,代理一词拆开来看就是代为受理,那显然是要涉及到请求被代理的委托方,提供代理的代理方,以及想要通 ...

  9. python 全栈开发,Day116(可迭代对象,type创建动态类,偏函数,面向对象的封装,获取外键数据,组合搜索,领域驱动设计(DDD))...

    昨日内容回顾 1. 三个类 ChangeList,封装列表页面需要的所有数据.StarkConfig,生成URL和视图对应关系 + 默认配置 AdminSite,用于保存 数据库类 和 处理该类的对象 ...

最新文章

  1. 如何用MathType插入公式编号
  2. PyQt5 技术篇-QTableWidget表格组件的行选择与列选择实例演示,表格组件的双击事件捕获,获取表格选中单元格的值
  3. 【干货】超全!华为交换机端口vlan详解~
  4. EasyUI中tree,Datagrid,pagenation的使用EasyUI中Datagrid和pagenation进行关联时,再次点击pagenation时让表格数据显示的问题
  5. spring mvc学习(39):restful的crud实现删除方式
  6. python docker实战_「docker实战篇」python的docker-docker镜像的创建使用dockerfile(3
  7. Java进程与子进程交互
  8. openbsd下实现双网卡负载均衡
  9. CCNA Cisco 安全配置
  10. new Option() 创建一个option标签
  11. win10 C语言qt调试,如何在Windows中调试Qt(MSVC)应用程序
  12. cass坡度土方计算案例_CASS土方量计算总结
  13. 例说图解TCP/IP协议族--PKI与证书(7)之给思科路由器制作证书
  14. Web前端后端傻傻分不清
  15. python小游戏:教你如何称霸朋友圈
  16. PHP 实现精确统计在线人数功能
  17. nrf51822代码流程(从main展开)
  18. 视频网站开发:JavaWeb做一个带自定义小表情的评论功能
  19. abaqus切削为什么没有切屑_Abaqus切削仿真常见问题及其解决个人总结
  20. 寄存器与移位寄存器(数字电路)

热门文章

  1. LWIP使用经验---变态级(转)
  2. CCS实例,网页栏目
  3. 去360总部参加网络信息安全会议经历
  4. GoogleMapAPI
  5. Tell me why -- Declan Galbraith
  6. qt android 设备权限,QtScrcpy: Android实时投屏软件,此应用程序提供USB(或通过TCP/IP)连接的Android设备的显示和控制。它不需要任何root访问权限...
  7. 3-13其他数学函数
  8. mysql jar jdk1.6_搭建非安装版mysql+jdk1.6+tomcat6
  9. cad坐标归零lisp_「软件技巧」厉害了!输入简单命令轻松解决CAD几类常见问题...
  10. 计算机不能检测到第二个屏幕,Win10检测不到第二个显示器怎么办?Win10第二个显示器不能识别解决方法...