AOP学习笔记

samgui(三桂)

AOP开发过程中包括的工作:

1、分离出系统中的关注点(提取出横切关注点,一般性关注点),分开核心模块级关注点和系统级的横切关注点

2、独立开发实现横切关注点

3、AOP框架设置关注点的连接点的位置(配置)

4、AOP框架会自动将模块关注点添加到指定连接点完成最终系统

5、通知(advice)规范,配置编织信息

编织(waver)是AOP实现的关键,说明了整体开发策略 AOP的强大就在于可以根据编织规则重新组合系统的方便性上. 比如有些编织规则可以做到对系统中的所有类的所有公共方法添加日志操作,可以对指定类指定公共方法添加.

AOP框架与原业务系统之间的交互过程: 用户启用AOP,AOP框架启动过程中会根据配置信息完成编织并加载原业务系统. 业务系统启动后,AOP讲不再对其控制,用户以后的交互还是在原业务系统上.

注意:由于引入了AOP,系统启动过程会因为AOP要完成对配置信息的加载和方面的编织而导致业务系统的整体启动时间比原来稍长

AOP主要完成2部分功能:

  1. 对框架进行初始化,包括配置信息管理,方面管理,连接点管理,导言管理等
  2. 启动原业务系统,包括配置信息进行编织处理和启动管理2部分

MyAop Framework:框架功能结构

Configuration Information Management:配置信息管理(AOP提供动态配置关注点和连接点等信息的功能,即每次改变配置文件不需要重新编译所有的类文件,使用Annotation,XML等方式)

Notic Management:通知管理

  1. AOP需要支持三种类型的通知,即before,after和around,before是相对于连接点之前执行的操作,after则是之后,around能够控制连接点的执行动作,代替或者跳过连接点的操作
  2. 为了保证方面分离后还可以同原系统进行交互,三种类型的通知都需要通过参数传递的方式获得原系统中连接点的多种信息,如连接点的参数类型参数值和连接点方法名称等
  3. AOP提供通知接口供开发人员实现横切关注点

Aspect Management:方面管理,主要负责组织AOP的所有方面.方面是添加到某连接点的所有通知的集合.其他连接点要使用相同的功能时,只要将该方面添加到连接点就可以了.

Connection Point Management:连接点管理

Introduction Management:导言管理,用来解决OOP中类的混合继承问题,改变目前的单支继承,使得一个类可以有2个以上的父类.每个导言通过添加多个mixin,可以实现混合继承

Waver Handle:编织处理

  1. AOP提供动态编织,编织的结果不能改变原系统的代码.当原系统脱离AOP时,只是缺少了AOP提供的AOP功能,依然可以正常运行.
  2. 编织后不产生新的源代码文件.因为产生代码文件的编织方式,需要经过代码生成和编译的过程,会验证影响运行速度.
  3. 编织的过程的配置信息可以动态进行修改,每次更改编织规则都不需要重新编译整个AOP框架及原业务系统.

Setup Management:启动管理,主要负责原业务系统的加载与启动

AOP核心部分-编织技术:

重要组成部分为编织时机及实现策略等

1、编织时机的选择决定了框架的健壮性和可扩展性

编织操作可以发生在如下几个阶段:

编译时:在对源代码进行编译时,特殊的编译器允许我们通过某种方式指定程序中各个方面进行编织的规则,并根据这些规则生成编译完成的应用程序 对于普通应用程序而言,在编译时进行编织操作是最为直观的做法.由于源程序中包含了应用的所有信息,因此这种方式通常支持最多类的连接点. 利用编译时编织,我们能够使用AOP系统进行细粒度的编织操作,例如读取或写入字段.源代码编译之后形成的模块将丧事大量的信息,因此通常采用 粗粒度的AOP方法.同时,对于传统的编译成为本地代码的语言如C++,Fortran等来说,编译完成后的模块往往跟操作系统平台相关,这就给建立统一的 编译后、载入时以及运行时编织机制造成了困难.对于编译成本地代码的语言而言,只有在编译时进行编织是最为可行的.尽管编译时编织具有功能强大、 适应面广泛等优点,但他的缺点也是很明显。首先它需要程序员提供所有的源代码,因此对于模块化的项目就力不从心了。即时能够提供所有模块的 源代码。它也造成了程序不能进行增量编译、编译时间变慢等不利之处。

编译后:根据编织规则对已经完成编译的程序模块进行编织操作

为了解决模块化编程的需求,有些AOP框架开始支持编译后编织的功能,程序员只需要获得编译完成之后的模块,就能进行编织操作.在AspnetJ中,不管是 程序的主要逻辑部分还是方面都可以先便已成为模块之后进行编织,而且主要逻辑部分完全可以采用普通的JavaC编译.而在AspcetC中,进行编译后编织 的要求是所有的程序模块都采用AspectC进行编译,可以看出,使用Java这样基于虚拟机的语言对于编写AOP程序是有优势的

载入时:在载入程序模块的时候进行编织操作

尽管编译后编织已经解决了不能获得所有源代码时进行AOP编织的需求,但是在这个框架流行的时代,我们需要更为灵活的安排我们的编织操作.如果程序 的主要逻辑部分和方面作为不同的组件开发,那么最为合理的编织时机就是在框架载入方面代码之时.因此我们可以看到,在JBoss和Spring中都提供了这样 的方式进行编织操作.在进行载入时编织时,编织操作之后的结果不会被保存.程序的主要逻辑部分和方面部分可以分别进行开发和编译,而且编织操作在程序 被载入时发生.AspectJ,Spring和JBoss都支持载入时编织.在Spring和JBoss的AOP实现中,框架先于应用程序启动,由框架来负责编织操作的运行.而在AspcetC中,一个特殊的类加载器被用于这个目的.这个类加载器可以方便的嵌入到框架应用程序中,从而能够为任意的框架提供AOP支持.

运行时:在运行时,根据程序运行时的情况,编织程序中的对象和方面

运行时编织可能是所有编织方式中最为灵活的,程序在运行过程中可以为单个的对象指定是否需要编织特定的方面.在JBoss项目中,利用运行时编织的特性 完成了JBoss Cache项目.在JBoss Cache中,如果一个对象被放置到Cache中,它的状态就被Cache AOP监视并且它的状态会被自动同步到一个分布式的缓存中. 如果这个对象不需要被缓存,那么它就和AOP不发生任何关系.对它的修改不会引发Cache的同步操作,值得一提的是,尽管AspectJ没有明确提供运行时编织的能力,在AspnetJ中可以通过一个简单的pattern实现运行时编织.

AOP实现策略,目前有以下几种:

  1. JavaSE动态代码技术
  2. 动态字节码生成技术
  3. Java代码生成技术
  4. 自定义类装载技术
  5. 语言扩展技术

目前几种主流AOP系统所支持的编织操作时机

AspectJ Spring AOP JBoss AOP AspectC Compile Time √ √ Post Compile Time √ √ Load Time √ √ √ Run Time √

动态织入,IL织入,XML,编译,Attribute元数据方式实现编织规则

AOP引擎 SetPoint

SetPoint是一款.NET框架下的全功能 (full-featured)AOP引擎.它着重为称为语义切点(semantic pointcuts)的定义依赖RDF/OWL的使用.它的功能为一个IL-level,highly dynamic weaver&LENDL,一个引人注目的定义语言

项目主页: http://setpoint.codehaus.org/

文档地址: http://setpoint.codehaus.org/Tutorials

下载地址: http://setpoint.codehaus.org/Downloads

AOP引擎 DotNetAOP

DotNetAOP为 CLR language提供AOP 框架基础属性。

AOP框架 NAop

项目主页: http://sourceforge.net/projects/aopnet/

下载地址: http://sourceforge.net/projects/aopnet/files

AOP框架 AspectSharp

AspectSharp是DotNet下的免费AOP框架,它以Dynamic Proxies和XML作为配置文件。

项目主页: http://sourceforge.net/projects/aspectsharp/

下载地址: http://sourceforge.net/projects/aspectsharp/files/

AOP框架 Encase

Encase 是C#编写开发的为.NET平台提供的AOP框架。Encase 独特的提供了把方面(aspects)部署到运行时代码,而其它AOP框架依赖配置文件的方式。这种部署方面(aspects)的方法帮助缺少经验的开发人员提高开发效率。

项目主页: http://theagiledeveloper.com/articles/Encase.aspx

C#的AOP框架 NKalore

NKalore 是一款编程语言,它扩展了C#允许在.net平台使用AOP。NKalore的语法简单、直观,它的编译器是基于Mono C#编译器(MCS)。NKalore目前只能在命令行或#Develop内部使用。NKalore兼容公共语言规范CLS(Common Language Specification),它可以在任何.NET开发环境中使用,包括微软的Visual Studio .NET。

项目主页: http://aspectsharpcomp.sourceforge.net/

下载地址: http://aspectsharpcomp.sourceforge.net/download.htm

PostSharp

PostSharp读取.NET字节模块,转换成对象模型。让插件分析和转换这个模型并写回到MSIL。

PostSharp使开发程序分析应用程序容易得像分析代码规则和设计模式,它使程序开发的思想变革为面向方面软件开发(AOSD/AOD)思想。

PostSharp is a tool that can reduce the number of lines of code in all major Microsoft .NET languages and improve its logical decoupling. Therefore its helps you delivering higher stability, cleaner design, and cheaper source code maintenance.

项目主页: http://www.postsharp.org/

下载地址: http://www.postsharp.org/download