小引:
如果安装了Java的反编译工具,可以反编译上篇文章中的Hello.class文件,我们将会发现该Hello.class文件不是由Hello.java文件编译得到的,该Hello.class里新增了很多内容------这表明AspectJ在编译时已增强了Hello.class类的功能,因此 AspectJ 通常被称为编译时增强的AOP框架。
与AspectJ相对的还有另外一种AOP框架,它们不需要在①编译时对目标类进行增强,而是②运行时生成目标类的代理类,该代理类要么与目标类实现相同的接口,要么是目标类的子类------总之,代理类都对目标类进行了增强处理,前者是JDK动态代理的处理策略,后者是CGLIB代理的处理策略。
Spring AOP以创建动态代理的方式来生成代理类,底层既可使用JDK动态代理,也可采用CGLIB代理。
一般来说,编译时增强的AOP框架在性能上更有优势------因为运行时动态增强的AOP框架需要每次运行时都进行动态增强。
AOP的基本概念:
AOP从程序运行角度考虑程序的流程,提取业务处理过程的切面。AOP面向的是程序运行中各个步骤,希望以更好的方式来组合业务处理的各个步骤。
AOP框架并不与特定的代码耦合,AOP框架能处理程序执行中特定切入点(Pointcut),而不与某个具体类耦合。AOP框架具有如下两个特征:
① 各步骤之间的良好隔离性。
② 源代码无关性。
下面是关于面向切面编程的一些术语:
① 切面(Aspect):业务流程运行的某个特定步骤,也就是应用运行过程的关注点,关注点可能横切多个对象,所以常常也称为横切关注点。
② 连接点(Joinpoint):程序执行过程中明确的点,如方法的调用或者异常的抛出。Spring AOP中,连接点总是方法的调用。
③ 增强处理(Advice):AOP框架在特定的切入点执行的增强处理。处理有around,before,after等类型。
④ 切入点(Pointcut):可以插入增强处理的连接点。简而言之,当某个连接点满足指定要求时,该连接点将被添加增强处理,该连接点也就变成了切入点。例如如下代码:
pointcut xxxPointcut()
:execution(void H*.say*())每个方法被调用都只是连接点,但如果该方法属于H开头的类,且方法名义say开头,那么该方法的调用执行将变成切入点。如何使用表达式来定义切入点是AOP的核心,Spring默认使用AspectJ切入点语法:
① 引入:将方法或字段添加到被处理的类中。Spring允许引入新的接口到任何被处理的对象。例如你可以使用一个引入,使任何对象实现isModified接口,以此来简化缓存。
② 目标对象:被AOP框架进行增强处理的对象,也被称为被增强的对象。如果AOP框架是通过运行时代理来实现的,那么这个对象将是一个被代理的对象。
③ AOP代理:AOP框架创建的对象,简单地说,代理就是对目标对象的加强。Spring中的AOP代理可以是JDK动态代理,也可以是CGLIB代理。前者为实现接口的目标对象的代理,后者为不实现接口的目标对象的代理。
④ 织入(Weaving):将增强处理添加到目标对象中,并创建一个被增强的对象(AOP代理)的过程就是织入。织入有两种实现方式:编译时增强(例如AspectJ)和运行时增强(例如CGLIB)。Spring和其他纯Java AOP框架一样,在运行时完成织入。
由前面的介绍知道:AOP代理其实是由AOP框架动态生成的一个对象,该对象可作为目标对象使用。AOP代理包含了目标对象的全部方法,但AOP代理中的方法与目标对象的方法存在差异:AOP方法在特定切入点添加了增强处理,并且回调了目标对象的方法。
AOP代理所包含的方法与目标对象的方法示意图如下:
本文介绍了面向切面编程(AOP)的基本概念及其在Spring框架中的应用。重点讲解了AOP中的核心术语,包括切面、连接点、增强处理、切入点、目标对象和AOP代理,并对比了编译时增强与运行时增强的不同之处。
1895

被折叠的 条评论
为什么被折叠?



