AOP面向切面编程

AOP面向切面编程

AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。

AOP技术的诞生并不算晚,早在1990年开始,来自Xerox Palo Alto Research Lab(即PARC)的研究人员就对面向对象思想的局限性进行了分析。他们研究出了一种新的编程思想,借助这一思想或许可以通过减少代码重复模块从而帮助开发人员提高工作效率。随着研究的逐渐深入,AOP也逐渐发展成一套完整的程序设计思想,各种应用AOP的技术也应运而生。

AOP技术在Java平台下是最先得到应用的。AspectJ通过定义一套Java语言的扩展系统,使开发者可以方便地进行面向方面的开发。AspectJ在2002年被转让给Eclipse Foundation,从而成为在开源社区中AOP技术的先锋,也是目前最为流行的AOP工具。AspectWerkz则是基于Java的动态的轻量级AOP框架。AspectWerkz仍然是开源社区中的产品,由BEA System提供赞助。Spring基于自身的IOC容器实现AOP,Spring AOP作为一种非侵略性、轻型的AOP框架,开发者无需使用预编译器或其他的元标签,在Java程序中应用AOP。目前,AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。商用软件制造商JBoss在其2004年推出的JBoss 4.0中,首次引入了AOP框架和组件。

在.Net的阵营中,AOP的发展主要依靠开源社区来推动,也推出了一些优秀的AOP框架,如:Aspect#,AspectDNG,Eos AOP等。下一小节,我们重点介绍一下Aspect#的使用。

AOP是OOP的一种补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。OOP而对于公共行为进行处理却不是很擅长,例如对于日志、安全验证和异常处理功能。我们可以把这些公共的行为称为横切(cross-cutting)代码。AOP就是关注这些横切代码的,把它们统一封装为一个可重用的组件,称为“方面(Aspect)”,AOP代表的是一个横向的关系。简单地说,就是将那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP横切的思想可以通过图8-7反映出来(图片来源网络)。

 
图8-7

实现AOP,主要通过两类方式:

1.采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;

2.采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间输入有关“方面”的代码。

方式不同效果却相同,具有的特性也是相同的:

·连接点(join point):是程序执行中的一个精确执行点,例如类中的一个方法。它是一个抽象的概念,在实现AOP时,并不需要去定义一个join point。

·切入点(point cut):本质上是一个捕获连接点的结构。在AOP中,可以定义一个point cut,来捕获相关方法的调用。

·通知(advice):是point cut的执行代码,是执行“方面”的具体逻辑。

·方面(aspect):point cut和advice结合起来就是aspect,它类似于OOP中定义的一个类,但它代表的更多是对象间横向的关系。

·引入(introduce):为对象引入附加的方法或属性,从而达到修改对象结构的目的。有的AOP工具又将其称为mixin。

AOP适用于如下功能:

·安全验证(Authentication )

·缓存(Caching )

·上下文传递(Context passing )

·错误处理(Error handling )

·后期加载(Lazy loading) 

·调试(Debugging)

·记录、跟踪、优化和监测(logging, tracing, profiling and monitoring) 

·性能优化(Performance optimization) 

·持久化(Persistence)

·资源池(Resource pooling) 

·同步(Synchronization) 

·事务(Transactions)

posted @ 2010-03-19 22:54  小川丶  阅读(497)  评论(0)    收藏  举报