AOP-面向切面的编程

课程概要:
  • 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实现,以解决企业级开发中的常见问题。


猜你喜欢

转载自blog.csdn.net/icarus_wang/article/details/51684401