AOP
AOP这一术语,近些年越发流行了。在java开发者社区里,学习使用Spring开发框架时,必定会涉及到AOP。不了解AOP不影响学习和使用Spring框架,不过在了解AOP之后,对于开发企业级应用则更加有利。本文视图以通俗的方式,整理一下AOP知识,以供初次接触的同行参考。
AOP与OOP
AOP的全称是 面向方面编程 (Aspect-Oriented Programming),这是Gregor Kiczales于1996年在PARC提出的一个术语。AOP是一种与OOP截然不同的看待应用程序结构的方式,按照AOP的观念,系统被分解为方面(aspect)或者关注点(concern),而不是对象。
这儿将AOP与OOP(面向对象编程 Object-Oriented Programming)相比较。Java开发者一般都比较熟悉OOP,大家都知道,OOP方式带来的最大好处就是代码复用,通过三大特性:封装、继承、多态,来复用代码。不过,若与AOP相比较,OOP的代码复用成程度,还差了那么一点儿。
代码复用
一般情况下,OOP能够很好地避免代码重复。具体继承可以帮助我们在不同类型之间共享相同的行为,多态可以让我们可以用相同的方式处理不同类型的对象,将注意力集中到它们的共同之处。但是,有些时候,我们无法用OOP避免代码重复,或者无法用OOP得到一个优雅的解决方案。
举一个很简单的栗子,假设我们有一个类,类里有一个公开方法是用来验证用户合法性的。那么这个公开方法,必然会其它很多类里被调用,而且调用方式都一样,伪代码如下ConcreteClassInstance.auth(userInstance)
。虽然重复的地方只是这一行,但这种代码将毫无规律地散布在整个对象模型中,造成无法避免代码的重复。
这行代码的关注点,即方面,就是用户合法性校验。采用AOP的话,我们可以达到这样的效果:仅在一个地方声明:当某某条件发生时,进行用户合法性校验。权威一点的解释就是:我们可以单独编写用户和合法性校验的代码,将其包装成一个方面(aspect),然后我们可以告诉AOP实现产品,如何在将方面织入(weave)到程序流程之中。具体的织入策略也有好几种,比如:代码生成和预编译,动态字节码生成、JavaEE的动态代理。
横切性问题
AOP的目标是将横切行(crosscutting)的问题以一种更加通用的方式模块化,从而提升程序的模块化程度。什么是横切性问题?即一个关注点(比如用户合法性检查)的实现代码,散落在很多个类或方法之中。很多企业级问题都具有横切性,比如事物管理、安全性、资源相关操作。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。