说到AOP肯定会想到切面、通知、切点等等。那什么是通知呢?之前我一直以为我们所说的通知就是我们写在切面中的方法,但是随着AOP认识的加深,现在发现所谓的通知不仅仅是我们写在切面中的方法,通知方法只是通知的一部分。也就是说我们在切面中定义的通知方法会被包装成一个真正的通知对象。通知有五种类型、他们的继承层次是什么样子?看下图:

这五个通知都继承AbstractAspectJAdvice抽象类,所以这个抽象类非常重要。Advice是一个空接口,所以就不介绍了,不过它有非常多的子接口和实现类。

一、AbstractAspectJAdvice

一)、AbstractAspectJAdvice的属性

AbstractAspectJAdvice的五个子类都没有属性,所以它们的属性都在这个抽象类中。一个对象是什么东西,主要看它的属性。所以一个通知到底是什么样子的,那就要看看这个通知的有什么属性。如下图,一个通知有许多的属性,为了能够想清楚一个通知大概是什么样子的,那就先看看它主要有哪些中要的属性。

一个通知有以下几个中要的属性:

①、切面的名称(bean的名称):也就是通知方法所在的切面
②、切面所属类型的类对象:切面对应的Class对象。
③、通知方法的名称:方法名,不包括参数。
④、通知方法对应的Method的对象:
⑤、通知方法的参数:这些参数方法一个数组中。
⑥、切点

我们在定义一个切面的时候通常会在里面定义好几个通知,如:前置通知、后置通知等等。但是我们在包装的时候,会将切面中的前置通知方法、切面、切点包装成一个AspectJBeforeMethodAdvice 对象。所以现在要是谈到一个通知,应该要想到一个通知具体是什么样子,它应该包含它所处的切面信息,切点信息,还有通知方法等,我觉得只要你能想到上面的六个主要属性,说明对通知算是了解了。

下面我把我debug时候的记录一个通知对象的几个属性和属性值,如下:蓝色为属性名,冒号后面是属性值。

declaringClass:class com.zcd.MyAspect----->切面所属类型的类对象。Class对象

aspectName:myAspect---->切面的名字

aspectJAdviceMethod: public void com.zcd.MyAspect.after()------>通知方法,Method对象

methodName:after---->方法名字

parameterTypes: []---->通知方法的参数。

declarationOrder: 5

pointcut:AspectJExpressionPointcut: () execution(* com.zcd.*.*(..))---->切点。AspectJExpressionPointcut对象

知道了一个通知对象由什么属性只是了解了这个对象长什么样子。但这个对象能干什么,有什么行为,这就需要看看它由什么主要的方法了。

二)、AbstractAspectJAdvice的主要方法

这个类的方法好像有点多,不过最最重要的方法也只有几个。我们在切面中定义一个通知方法就是为了让通知方法能够在适当的时机执行,而一个通知对象中又包含有通知方法,那么很有可能这个通知对象会负责这个通知方法的调用,也就是说在程序执行的过程会通过这个通知对象来调用通知方法。所以现在来看看这个通知对象是怎么调用通知方法的,这一任务由哪几个方法来完成。

一下三个方法就是为了完成通知方法的调用的:

①、根据这个方法的名字就知道它的任务就是调用通知方法了。它会在内部调用第三个方法。

    /**
* Invoke the advice method.
* @param jpMatch the JoinPointMatch that matched this execution join point
* @param returnValue the return value from the method execution (may be null)
* @param ex the exception thrown by the method execution (may be null)
* @return the invocation result
* @throws Throwable in case of invocation failure
*/
protected Object invokeAdviceMethod(JoinPointMatch jpMatch, Object returnValue, Throwable ex) throws Throwable {
return invokeAdviceMethodWithGivenArgs(argBinding(getJoinPoint(), jpMatch, returnValue, ex));
}

②、这个第一个方法的重载方法。

    // As above, but in this case we are given the join point.
protected Object invokeAdviceMethod(JoinPoint jp, JoinPointMatch jpMatch, Object returnValue, Throwable t)
throws Throwable { return invokeAdviceMethodWithGivenArgs(argBinding(jp, jpMatch, returnValue, t));
}

③、这个三个方法中最重要的方法。

    protected Object invokeAdviceMethodWithGivenArgs(Object[] args) throws Throwable {
Object[] actualArgs = args;//这是通知方法的参数.
if (this.aspectJAdviceMethod.getParameterTypes().length == 0) {
actualArgs = null;//如果通知方法中参数为空的话,就将actualArgs设为null.
}
try {
ReflectionUtils.makeAccessible(this.aspectJAdviceMethod);
// TODO AopUtils.invokeJoinpointUsingReflection 将切面和通知方法的参数传进去
return this.aspectJAdviceMethod.invoke(this.aspectInstanceFactory.getAspectInstance(), actualArgs);//通过这一句代码调用通知方法。
}
catch (IllegalArgumentException ex) {
throw new AopInvocationException("Mismatch on arguments to advice method [" +
this.aspectJAdviceMethod + "]; pointcut expression [" +
this.pointcut.getPointcutExpression() + "]", ex);
}
catch (InvocationTargetException ex) {
throw ex.getTargetException();
}
}

AOP-通知-笔记的更多相关文章

  1. Spring AOP学习笔记

      Spring提供了一站式解决方案:          1) Spring Core  spring的核心功能: IOC容器, 解决对象创建及依赖关系          2) Spring Web ...

  2. Spring学习(十五)----- Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

  3. Spring AOP通知实例 – Advice

    Spring AOP(面向方面编程)框架,用于在模块化方面的横切关注点.简单得说,它只是一个拦截器拦截一些过程,例如,当一个方法执行,Spring AOP 可以劫持一个执行的方法,在方法执行之前或之后 ...

  4. AOP通知无法切入指定方法

    AOP通知,切入指定方法时拦截不到,可能是拦截的方法本身是被本类的其他方法调用的,根据AOP反射原理是无法拦截本类中方法调用的方法的.如: class AImpl implements AIf { s ...

  5. Spring基础——AOP通知

    spring(AOP通知) 切面 切面是封装通用业务逻辑的组件,可以作用到其他组件上.是spring组件中的某个方法.无返回类型.参数类型与通知类型有关.一个切面 开启数据库 关闭数据库 开启事务 检 ...

  6. AOP通知类型

    AOP通知类型 前置通知 在目标方法执行之前进行操作 后置通知 在目标方法执行之后 进行操作 环绕通知 在目标方法执行之前 和之后进行操作 public Object arount() 异常抛出通知 ...

  7. Spring入门IOC和AOP学习笔记

    Spring入门IOC和AOP学习笔记 概述 Spring框架的核心有两个: Spring容器作为超级大工厂,负责管理.创建所有的Java对象,这些Java对象被称为Bean. Spring容器管理容 ...

  8. Aop学习笔记

    在学习编程这段时间我想大家都是习惯了面向过程或者面向对象的思想来编程,较少或者没有接触过面向方面编程的思想. 那么什么是面向方面(Aspect)——其实就是与核心业务处理逻辑无关的切面,例如记录日志. ...

  9. Spring系列26:Spring AOP 通知与顺序详解

    本文内容 如何声明通知 如何传递参数到通知方法中 多种通知多个切面的通知顺序 多个切面通知的顺序源码分析与图解 声明通知 Spring中有5种通知,通过对应的注解来声明: @BeforeBefore ...

  10. .Net中的AOP读书笔记系列之AOP介绍

    返回<.Net中的AOP>系列学习总目录 本篇目录 AOP是什么? Hello,World! 小结 本系列的源码本人已托管于Coding上:点击查看,想要注册Coding的可以点击该连接注 ...

随机推荐

  1. DedeCMS修改管理员用户名

    织梦内容管理系统(DedeCMS) 以简单.实用.开源而闻名,是国内最知名的PHP开源网站管理系统,也是使用用户最多的PHP类CMS系统,在经历多年的发展,目前的版本无论在功能,还是在易用性方面,都有 ...

  2. [PHP] 超全局变量$_FILES上传文件

    1.$_FILES --超全局变量,HTTP 文件上传变量 通过 HTTP POST 方式上传到当前脚本的项目的数组,PHP 能够接受任何来自符合 RFC-1867 标准的浏览器上传的文件, 上传的过 ...

  3. [javaSE] 并发编程(线程间通信)

    新建一个资源类Resource 定义成员变量String name 定义成员变量int age 新建一个输入类Input,实现Runnable接口 定义一个构造方法Input(),传入参数:Resou ...

  4. SpringBoot(一)初遇

    环境: IDEA 2018.1.3 , jdk 1.8 , maven 3.3.9 零 第一次接触springboot, 如何学习比较困惑, 思前想后最后决定从文档来学习, 以下为学习中的参考资料: ...

  5. K:有限状态自动机

      有限状态自动机是一种特殊的状态机.它表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型.有限状态自动机分为两种,一种是 确定有限状态自动机(DFA) ,一种是 非确定有限状态自动机(NF ...

  6. 【学习笔记】--- 老男孩学Python,day14 python内置函数大全

    参考:  https://www.cnblogs.com/pyyu/p/6702896.html http://www.runoob.com/python3/python3-built-in-func ...

  7. 移动端地区选择mobile-select-area插件的使用方法

    顾名思义,mobile-select-area插件就是使用在移动端上的进行地区选择的插件,而且使用方法简单,我就说我是怎么用的吧 一.准备工作 首先肯定要下载插件对应的css+js文件, 当你下载好这 ...

  8. 区别String、StringBuilder、Stringbuffer的总结

    1.三者在执行速度上: StringBuilder > StringBuffer > String 2. String:不可变长字符串 StringBuilder : 为可变长字符串 St ...

  9. JSP 插入到数据库的数据出现 “SQLServerException: 将截断字符串或二进制数据” 错误解决方案

    最近在编写一个小型基于的jsp系统开发.掌握数据库一直感觉还不错.但是今天就出现了一个问题困扰我大半天.后来本来准备睡觉,但是觉得今天不解决这个问题恐怕晚上是“彻夜难眠啊”!!于是打开电脑,又开始捣腾 ...

  10. VSCode环境

    PythonPython for VSCode Language Support for Java(TM) by Red HatJava Language SupportJava DebuggerJa ...