说到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. clipboard.js实现复制功能

    项目地址:https://github.com/zenorocha/clipboard.js 现代化的“复制到剪切板”插件.不包含 Flash.gzip 压缩后仅 3kb. 为什么使用它 复制文字到剪 ...

  2. Java基础教程(14)--嵌套类

      Java允许在一个类中定义另外一个类,这样的类被称为嵌套类,就像下面这样: class OuterClass { ... class NestedClass { ... } }   嵌套类分为两种 ...

  3. mac下安装MySQL【转】

    转:http://www.jb51.net/article/103841.htm 1.官网下载 MySQL v5.7官方正式版下载地址:http://www.jb51.net/softs/451120 ...

  4. 一分钟配置jdk

    一.下载jdk 直接进入网站:https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html ...

  5. Javascript实现图片翻转

    使用Js的对象属性能实现简单的翻转效果.通过onMouseover事件和onMouseOut事件就能实现鼠标移到链接上和移开链接发生反应.给两个图片加上链接实现都能翻转的效果. reverse.htm ...

  6. 您可能不知道的CSS元素隐藏“失效”以其妙用——张鑫旭

    一.CSS元素隐藏 在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.后宫选秀——一个一个看. { display: non ...

  7. 用jquery实现带左右按键的轮播图

    成品如下: 简单来说就是点击“右”按钮时,转换到右边的下一幅图片,同时上面的小方块颜色也跟着改变,如果已经是最后一幅图片,再点击“右”,则转换到第一幅图片,是直接向左移找到第一幅图的,明天再做一下无缝 ...

  8. android开启线程的误区

    发现一些刚学android的人,和我当初一样,对android的线程会存在着一定误区. 在android中,开启新线程时,一些人会用以下方法: new Handler().post(r); 但是这样并 ...

  9. ASP.Net与JSP如何共享Session值

     思路: ASP.NET中序列化Session以二进制数据保存到数据库,然后由JSP读取数据库中的二进制数据反序列化成Session对象,再强制转化成JAVA的Session对象登录的ASPX文件 ...

  10. linux安装memcached

    一:为什么要使用memcached 瓶颈:互联网发展,特别在web2.0兴起之后,传统数据库开始出现瓶颈 1:对数据库的高并发读写 2:对海量数据库的处理(海量数据查找)memcache 是高性能的分 ...