Advice

advice解释为通知,需要执行的增强逻辑方法。

advice规范接口如图,分为了before,after等等,为什么没有around呢,因为是通过interceptor实现的。

这里可以看出,AfterAdvice最终会被转换包装成AfterReturningAdviceInterceptor实现类进行适配桥接,同理BeforeAdvice也会被包装成MethodBeforeAdviceInterceptor最终调用MethodIntercepter#invoke()方法进行适配。

限于图片展示范围以上均是还没有到具体API使用实现类,我们继续探究其实现类

PointCut

pointCut解释为切点,即我们需要给哪些方法进行代理增强,也就是切面定义中的切点表达式,根据这个表达式能匹配到具体需要增强的方法,根据该接口的规范我们可以看到其实现类持有了切点表达式pointcoutExpression,匹配的方法shadowMatchCache缓存。

其接口定义的方法规范:

Advisor

advisor解释为通知者,他是Advice和PointCut的结合,组合了通知和切点那么就能很明确的知道那个方法需要增强什么逻辑,在Advisor中Advice和PointCut是一对一的。

可以看到针对不同类型的切点表达式有具体实现,其侧重点不一样,其中DefaultPointcutAdvisor是全匹配,即匹配所有类的所有方法(默认情况,可以改变表达式)。

而接口方法为:

从接口方法很容易看到Advisor就是Advice和Pointcut的组合,从中可以获取Advice和Pointcut。

Advised

advised可以理解为已经织如的,完成的代理组合体,Advised接口定义了很多操作方法,其实现类持有了多个Advisor,可以向Advised对象中添加Advisor,同时可对Advisor进行增删查改(isFrozen=false时)。

在spring中默认情况下ProxyConfig的opaque=false情况下,生成的所有代理对象无论是JDK代理还是CJLIB代理均实现了Advised接口,也就是说在Spring中我们可以将所有的代理对象转为AdvisedAdvised advised = (Advised)proxy

有一段代码如下:

public static void main(String[] args) {DefaultEchoService defaultEchoService = new DefaultEchoService();// 注入目标对象(被代理)ProxyFactory proxyFactory = new ProxyFactory(defaultEchoService);// 添加 Advice 实现 MethodInterceptor < Interceptor < AdviceproxyFactory.addAdvice(new EchoServiceMethodInterceptor());// 获取代理对象EchoService proxy = (EchoService) proxyFactory.getProxy();System.out.println(proxy.echo("Hello,World"));Advised advised = (Advised) proxy;//直接给代理对象添加通知(会被包装为匹配所有方法的Advisor)advised.addAdvice(new MethodBeforeAdvice() {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("before--------------");}});System.out.println(proxy.echo("hello 2"));//代理对象还可以二次代理ProxyFactory pf1 = new ProxyFactory(proxy);Object proxy2 = pf1.getProxy();System.out.println(proxy2.getClass());
}

我们debug看下代理对象信息:

不难看出JdkDynamicAopProxy持有了一个Advised的实现类ProxyFactory,代理对象调用addAdvice()方法为什么可行,就是因为实际调用的是h对象的advised属性的addAdvice()去执行,将Advice添加到了Advised的Advisor集合中(advisors属性),这里就相当于静态代理模式。

在Spring中每个代理对象都有不同的JDKDynamicAopProxy实例(h对象都是new的),h对象中不同的ProxyFactory对象(advised实现)。这也不难理解,因为每个代理对象的增强逻辑不尽相同,那么其advisors集合中的通知者肯定不同,也就意味着ProxyFactory对象必定不同,也即InvocationHandler对象必定不同。

JdkDynamicAopProxy实现了InvocationHandler接口那么其实现的invoke()方法至关重要,后面我们接着分析。

到这里我们似乎已经很好理解Advised的本意了,他就是已经织如完成的通知者集合,包含在代理对象中,代理对象已经可以直接使用,在被增强的方法上会调用通知方法。

JoinPoint

joinpoint就是运行时的连接点,根据接口定义我们知道它包裹了要执行的对象,方法,参数等。spring只支持方法类型的连接点,虽然有构造方法连接点的定义,但是未实现,故不支持构造方法。

我们可以看到这里有两种实现方式,意识基于jdk的动态代理,二是基于cglib实现。

各个接口定义的方法:

AOP名词解释Advice,Pointcut,Advisor,Joinpoint,Advised是什么?相关推荐

  1. 【小家Spring】Spring AOP各个组件概述与总结【Pointcut、Advice、Advisor、Advised、TargetSource、AdvisorChainFactory...】

    每篇一句 基础技术总是枯燥但有价值的.数学.算法.网络.存储等基础技术吃得越透,越容易服务上层的各种衍生技术或产品 相关阅读 [小家Spring]Spring AOP原理使用的基础类打点(AopInf ...

  2. spring的aop名词解释

    AOP名词学习,你还得学AOP名词,毕竟正式的玩AOP的话,懂得这些行话,就像你去混黑道,你是不是得学黑话,要不然你听不懂多丢人啊,咱们学一下AOP中的名词,名词有这些,在这里来解释一下这个名词 我是 ...

  3. Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration

    Spring AOP示例教程 - Aspect,Advice,Pointcut,JoinPoint,Annotations,XML Configuration Spring Framework是基于两 ...

  4. Aspect Joinpoint Advice Pointcut 区别

    1. Aspect Joinpoint Advice Pointcut 区别 When you go out to a restaurant, you look at a menu and see s ...

  5. spring关于Aspect、Joinpoint、Advice Pointcut的区别

    Aspect Joinpoint Advice Pointcut 区别 When you go out to a restaurant, you look at a menu and see seve ...

  6. (转)使用CGLIB实现AOP功能与AOP概念解释

    http://blog.csdn.net/yerenyuan_pku/article/details/52864395 使用CGLIB实现AOP功能 在Java里面,我们要产生某个对象的代理对象,这个 ...

  7. 【Spring Boot入门】AOP基础及Advice的执行顺序

    本文主要分为两个部分,首先介绍AOP的基础,包括为什么要使用AOP以及AOP中的基本概念,然后讲解AOP中各类Advice的执行顺序并给出简单示例. 一.AOP基础 1.为什么要使用AOP AOP(A ...

  8. 第15章-Spring AOP切点表达式(Pointcut)详解

    文章目录 一.概述 二.切点表达式配置 1. 内置配置 2. 注解配置 3. 公共配置 二.切点表达式类型 **`execution`** **`within`** **`this`** **`tar ...

  9. Spring AOP中是如何注册Advisor的?

    前置博文: Spring AOP中如何为Bean创建代理? Spring AOP中是如何注册Advisor的? Spring AOP如何为目标方法创建拦截器链? Spring AOP拦截器调用的实现 ...

  10. AOP -- 注解 @Aspect 、@Pointcut

    目录 1.基本概念 1.1.切面类 @Aspect 1.2.切点 @Pointcut 1.3.Advice 1.4.JoinPoint 1.5.运算符用法 1.6.@annotation(annota ...

最新文章

  1. 如何利用离散Hopfield神经网络进行数字识别(2)
  2. 数据结构——折半查找
  3. 【专访】PP租车张丙军:“打虎亲兄弟“,好团队才能书写互联网传奇
  4. camunda流程引擎如此简单「四」
  5. LeetCode 82 删除排序链表中的重复元素 II python
  6. maven -Dmaven.skip.test=true 和 -DskipTests=true的区别
  7. hihocoder A Game 区间dp
  8. LeetCode 295. 数据流的中位数(大小堆)
  9. 【学习笔记】第三章——内存 IV(虚拟内存、请求分页、页面置换、缺页中断、抖动现象)
  10. github的应用详解
  11. 关于北京皮纹智力测量与台湾皮纹测量智力测试争议的几点回应之二
  12. .net 数据存储 mysql_asp.net实现存储和读取数据库图片
  13. c c++ sizeof
  14. 《我的互联网方法论》读书笔记
  15. GGally与pairs相关关系图_史上最全(二)
  16. 如何获得微信小游戏源码
  17. nmake 环境变量配置
  18. 爬虫 - 超级鹰的基本使用
  19. Dialog去掉默认白色背景
  20. b站会员转正自动答题

热门文章

  1. Unity IOS 微信SDK 记录
  2. 通过JS导出Excel。将JS数组转换为VB数组
  3. Android Accessibility大致解析,通过adb运行纯java代码打开应用的辅助功能
  4. BUUCTF [0CTF 2016] piapiapia
  5. 架构系列---百度分布式唯一ID生成器UidGenerator解析
  6. Kubernetes in Action 免积分下载
  7. springboot整合谷歌身份验证
  8. python 读文件夹下面所有csv格式文件
  9. 契约精神,姜戈里的医生为什么要杀奴隶主 (标题有剧透),及编程等乱七八糟的...
  10. 微信小程序账号注册初始化环境搭建