Top
首页 > 老文章 > 正文

分享:AOP 框架与原业务系统之间的交互过程

分享:AOP 框架与原业务系统之间的交互过程
发布时间:2011-03-21 04:57        来源:        作者:刘雷
【赛迪网】AOP为Aspect Oriented Programming的缩写,意为:面向方法编程,可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,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:连接点管理 根据目前OOP的特性,AOP提供对方法,构造函数和字段三种类型连接点的支持 AOP提供对同一连接点添加多个通知的支持.所有被添加到该连接点的通知按照顺序执行,并且用户可以控制通知的执行流程-代替或者跳过后面将要执行的通知 Introduction Management:导言管理,用来解决OOP中类的混合继承问题,改变目前的单支继承,使得一个类可以有2个以上的父类.每个导言通过添加多个mixin,可以实现混合继承 Waver Handle:编织处理 1,AOP提供动态编织,编织的结果不能改变原系统的代码.当原系统脱离AOP时,只是缺少了AOP提供的AOP功能,依然可以正常运行. 2,编织后不产生新的源代码文件.因为产生代码文件的编织方式,需要经过代码生成和编译的过程,会验证影响运行速度. 3,编织的过程的配置信息可以动态进行修改,每次更改编织规则都不需要重新编译整个AOP框架及原业务系统. Setup Management:启动管理,主要负责原业务系统的加载与启动 AOP核心部分-编织技术: 重要组成部分为编织时机及实现策略等 1,编织时机的选择决定了框架的健壮性和可扩展性 编织操作可以发生在如下几个阶段: (1) 编译时:在对源代码进行编译时,特殊的编译器允许我们通过某种方式指定程序中各个方面进行编织的规则,并根据这些规则生成编译完成的应用程序 对于普通应用程序而言,在编译时进行编织操作是最为直观的做法。由于源程序中包含了应用的所有信息,因此这种方式通常支持最多类的连接点。利用编译时编织,我们能够使用AOP系统进行细粒度的编织操作,例如读取或写入字段.源代码编译之后形成的模块将丢失大量的信息,因此通常采用粗粒度的AOP方法。同时,对于传统的编译成为本地代码的语言如C++,Fortran等来说,编译完成后的模块往往跟操作系统平台相关,这就给建立统一的编译后、载入时以及运行时编织机制造成了困难。对于编译成本地代码的语言而言,只有在编译时进行编织是最为可行的。尽管编译时编织具有功能强大、适应面广泛等优点,但他的缺点也是很明显。首先它需要程序员提供所有的源代码,因此对于模块化的项目就力不从心了。即使能够提供所有模块的源代码。它也造成了程序不能进行增量编译、编译时间变慢等不利之处。 (2)编译后:根据编织规则对已经完成编译的程序模块进行编织操作 为了解决模块化编程的需求,有些AOP框架开始支持编译后编织的功能,程序员只需要获得编译完成之后的模块,就能进行编织操作。在AspnetJ中,不管是程序的主要逻辑部分还是方面都可以先编译成为模块之后进行编织,而且主要逻辑部分完全可以采用普通的JavaC编译,而在AspcetC中,进行编译后编织的要求是所有的程序模块都采用AspectC进行编译,可以看出,使用Java这样基于虚拟机的语言对于编写AOP程序是有优势的 (3)载入时:在载入程序模块的时候进行编织操作 尽管编译后编织已经解决了不能获得所有源代码时进行AOP编织的需求,但是在这个框架流行的时代,我们需要更为灵活的安排我们的编织操作.如果程序的主要逻辑部分和方面作为不同的组件开发,那么最为合理的编织时机就是在框架载入方面代码之时.因此我们可以看到,在JBoss和Spring中都提供了这样的方式进行编织操作.在进行载入时编织时,编织操作之后的结果不会被保存.程序的主要逻辑部分和方面部分可以分别进行开发和编译,而且编织操作在程序被载入时发生.AspectJ,Spring和JBoss都支持载入时编织.在Spring和JBoss的AOP实现中,框架先于应用程序启动,由框架来负责编织操作的运行.而在AspcetC中,一个特殊的类加载器被用于这个目的.这个类加载器可以方便的嵌入到框架应用程序中,从而能够为任意的框架提供AOP支持. (4)运行时:在运行时,根据程序运行时的情况,编织程序中的对象和方面 运行时编织可能是所有编织方式中最为灵活的,程序在运行过程中可以为单个的对象指定是否需要编织特定的方面.在JBoss项目中,利用运行时编织的特性 完成了JBoss Cache项目.在JBoss Cache中,如果一个对象被放置到Cache中,它的状态就被Cache AOP监视并且它的状态会被自动同步到一个分布式的缓存中. 如果这个对象不需要被缓存,那么它就和AOP不发生任何关系.对它的修改不会引发Cache的同步操作,值得一提的是,尽管AspectJ没有明确提供运行时编织的能力,在AspnetJ中可以通过一个简单的pattern实现运行时编织。 AOP实现策略,目前有以下几种: 1,JavaSE动态代码技术 2,动态字节码生成技术 3,Java代码生成技术 4,自定义类装载技术 5,语言扩展技术
加载更多

专题访谈

合作站点
stat