8.4.3: AOP 的基本概念

本文介绍了面向切面编程(AOP)的基本概念及其在Spring框架中的应用。重点讲解了AOP中的核心术语,包括切面、连接点、增强处理、切入点、目标对象和AOP代理,并对比了编译时增强与运行时增强的不同之处。

小引:

如果安装了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代理所包含的方法与目标对象的方法示意图如下:




评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值