课程概要:
- AOP的简介
- AOP的示例
- AOP的术语
- AOP的实现者
一.AOP的简介
1.AOP的基本概念
AOP即Aspect-Oriented programming的缩写,中文意思是面向切面(或方面)编程。他是一种思想,可在不改变程序源码的情况下为程序添加额外的功能。
2.AOP的发展阶段
- 静态AOP:Aspect形式,通过特定的编译器,将实现后的Aspect编译并织入到系统的静态类中。
- 动态AOP:AOP的织入过程在系统运行开始之后进行,而不是预先编译到系统中。
3.AOP的主要意图
允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现业务逻辑即可,并不负责其他的系统级关注点。
4.AOP的应用场景
日志记录、跟踪、监控和优化,性能统计、优化,安全、权限控制,应用系统的异常捕捉及处理,事物处理,缓存,持久化,懒加载(Lazy loading),内容传递,调试,资源池,同步等等。
二.AOP的示例
public class ForumService{ public void removeTopic(int topicid){ pmomitor.start(); transManager.beginTransaction(); topicDao.removeTopic(topicid); transManager.commit(); pmomitor.end(); } }上面的代码是一个论坛的性能监视代码段,他的横切逻辑示意图为:
其中业务逻辑的抽取主要是:将相同功能的代码段横向抽取出来,使用横切的逻辑来实现。
三.AOP的术语
- 连接点:程序执行的某个特定位置,比如类初始化前,初始化后,方法调用前,方法调用后等等
- 切点:通过切点来定位特定的连接点
- 增强:织入到目标的类连接点上的一段程序代码
- 目标对象:增强逻辑的织入目标类
- 引介:引介是一种特殊的增强,他为类添加一些属性和方法
- 织入:将增强添加到目标类的具体连接点上的过程
- 代理:一个类被AOP织入增强后,会产生一个结果类,该类是融合了原类和增强逻辑的代理类
- 切面:由切点和增强组成,既包括了横切逻辑的定义,也包括了连接点的定义
四.五种通知
- 前置通知:在目标方法调用之前执行。不能阻止后续执行,除非抛异常。
- 后置通知:在目标方法调用之后执行。目标方法正常结束才执行。
- 异常通知:在目标方法调用发生异常之后执行。但是如果目标方法中捕获了异常,那么异常通知不会执行。
- 最终通知:在目标方法调用之后执行。目标方法正常或异常都执行。
- 环绕通知:在目标方法调用之前和之后执行。
说明:
- 后置通知可以接受目标方法的返回值。
- 最终通知中不能访问返回值,因为方法可能会出异常。
- 异常通知可以接收异常对象,并且可以指定在出现特定异常时才执行。
五种通知在内部的组织
try { // 调用前置通知 // 环绕前置处理 // 调用目标对象方法 // 环绕后置处理 // 调用后置通知 } catch (Exception e) { // 调用异常通知 } finally { // 调用最终通知 }
四.AOP的实现者
以下列举的是一些常用的基于Java的AOP实现者
1.AspectJ
AspectJ是目前最完善的AOP语言,对Java编程语言进行了扩展,定义了AOP语法,能够在编译期提供横切代码的织入。AspectJ提供了两种横切实现机制,一种称为动态横切(Dynamic Crosscuting),另一种成为静态横切(Static Crosscuting)。
2.AspectWerkz
基于java的简单、动态和轻量级的AOP框架,支持运行期或者类装载期织入横切代码,它拥有一个特殊的类装载器。他与AspectJ项目已经合并,第一个发行版是AspectJ5。扩展AspectJ语言,以基于注解的方式支持类似AspectJ的代码风格。
3.JBoss AOP
JBoss是一个开源的符合J2EE规范的应用服务器,作为J2EE规范的补充,JBoss中引入了AOP框架,为普通Java提供了J2EE服务,而无需遵循EJB规范。JBoss通过类载入时,使用Javassis对字节码操作实现动态AOP框架。
4.Spring AOP
Spring AOP使用纯Java实现,不需要专门的编译过程,不需要特殊的类装载器,他在运行期通过代理方式向目标类织入增强代码。Spring并不尝试提供最完整的AOP实现,主要侧重一种和Spring IoC容器整合的AOP实现,以解决企业级开发中的常见问题。