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. 一张图解析如何让img垂直居中对齐
  2. python自动化干什么-python已经自动化了,大家一般用什么测试框架?
  3. 深入分析 Flutter 初始化流程
  4. 数据库 chapter 12 数据库管理系统
  5. 为什么 Java 在 25 年之后依旧如此年轻:一个架构师的看法
  6. 硅谷程序员的回归能拯救印度“芯”吗?
  7. POJ 3461题解(kmp算法)文本串和子串匹配
  8. 将ArcMap中的符号样式导出的供ArcPad使用
  9. 在线渐变配色网站分享
  10. Unrecognized Android Studio (or Android Support plugin for IntelliJ IDEA) version ‘202.7660.26.42.74
  11. 如何提高学习效率,三大法则,五大步骤
  12. linux androidx86双系统,ubuntu下安装RemixOS双系统(Android x86)
  13. uni-app老年模式字体设置思路
  14. 在vue项目中引入高德地图并使用
  15. 学习linux能做什么?
  16. arduino的基本函数
  17. golang 自定义日志
  18. java集合源码分析
  19. 中国娱记的鼻祖留心shuo新浪博客
  20. 安卓的app在所有应用商店上架方法整理

热门文章

  1. 褚橙是如何用互联网营销颠覆橙子的?
  2. Quantile g-computation的介绍及R实现
  3. 如何编写一个投票功能的智能合约
  4. UVM 事务级建模TLM 单向/多向通信 端口 FIFO通信
  5. 几种 Proximity Graphs 的单调性分析
  6. JSP网上图书商城项目管理系统
  7. 大一计算机考试题库打字题,大一计算机考试题库
  8. 蘑菇街大三Java后端暑期实习
  9. JavaWeb个人信息修改及修改密码
  10. jmeter的吞吐量控制器