您的位置:首页 > 编程语言

AOP-面向切面的编程

2016-06-15 18:33 267 查看
课程概要:

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实现,以解决企业级开发中的常见问题。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: