AOP(Aspect Oriented Programing),意为面向切面编程,其实看了很多书本的介绍和说明,我觉得这些解释都太过书面,也可能是翻译的原因,总觉得还是不太懂,也难以理解这种叫法,尤其是这个切面。其实切面在数学中指的是“和球面只有一个交点的平面”,我猜测spring团队之所以这么起名应该也是受了这种数学思想的启发,所以我也以这个为出发点去理解它。面向切面编程,假设我的某个业务逻辑是一个球,有一个切面和它相交于一点,所以它们互不干扰,只是通过这个切点连接,帮助我们完成一些功能,我觉得AOP它跟拦截器是很类似的,只不过它就是把拦截器的功能抽取成一个规范流程,或者说是约定,让开发者按照这种流程去写代码,它的底层使用的是动态代理,其实就是一个拦截器,只不过比拦截器要规范和强大一些。下面是我从一本书上看来的AOP的流程图,理解了这种流程图也就能理解AOP的实现了:

Spring AOP(一)--基本概念-LMLPHP

从上图能看出,切面就是一个规范的流程,它有四类通知,通过切点来拦截连接点,因为概念太多,先通过这个图说一下面向编程中的术语。

一、面向切面编程的术语

1、切面(Aspect)

切面就是一套规范的流程,可以理解为一个拦截器,能定义被拦截方法执行前后可以执行的操作。

2、通知(Advice)

通知就是切面中的方法,它根据在代理真实对象方法调用前、后的顺序和业务逻辑进行区分,Spring AOP中有四种通知:

  • 前置通知(before):在动态代理反射原有对象方法或者执行环绕通知前执行的通知功能;
  • 后置通知(after):在动态代理反射原有对象方法或者执行环绕通知后执行的通知功能,不管是否返回异常都会被执行;
  • 返回通知(afterReturning):在动态代理反射原有对象方法或者执行环绕通知正常返回无异常时执行的通知功能;
  • 异常通知(afterThrowing):在动态代理反射原有对象方法或者执行环绕通知产生异常时执行的通知功能;
  • 环绕通知(around):在动态代理中,它可以取代当前被拦截对象的方法,提供回调原有被拦截对象的方法;

3、引入(Introduction)

引入允许我们在现有类里添加的自定义类或方法。比如我们要对一个被代理对象的逻辑进行优化,但是不能修改原方法时,可以使用引入来进行增强;

4、切点(Pointcut)

切点就是告诉Spring AOP什么时候启动拦截器并织入对应流程中。

5、连接点(join point)

连接点对应的是具体需要拦截的东西,比如通过切点的正则表达式去判断哪些方法是连接点,从而织入对应的通知;

6、织入(Weaving)

织入是一个生成代理对象,并且将切面内容放入到流程中的过程,它的实现方式就是动态代理。

二、Spring对AOP的支持

AOP并不是Spring框架独有的,只是Spring是支持AOP的框架之一。每一种框架对AOP的支持都有自己的特点,有些支持对方法参数的拦截,有些支持对方法的拦截,而Spring AOP它是一种基于方法拦截的AOP,且只能支持对方法的拦截,在Spring中有四种实现方式:

1⃣️使用ProxyFactoryBean和对应的接口实现AOP

2⃣️使用XML的方式实现

3⃣️使用@AspectJ注解驱动切面

4⃣️使用AspectJ注入切面

在spring中常用的是@AspectJ注解方式,XML方式能起到一定的辅助作用。

上面的术语实在是太晦涩了,我是从《JavaEE互联网轻量级框架整合开发》中选取的,下一篇文章我会通过代码实现的方式对这些术语进行解释。

05-26 11:37