杂项-编程:AOP(面向切面编程)

ylbtech-杂项-编程:AOP(面向切面编程)
在软件业,AOP为Aspect Oriented Programming的缩写,意为: 面向切面编程经过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是 OOP的延续,是软件开发中的一个热点,也是 Spring框架中的一个重要内容,是 函数式编程的一种衍生范型。 利用AOP能够对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度下降,提升程序的可重用性,同时提升了开发的效率
1.返回顶部
一、

名称含义

Aspect Oriented Programming(AOP)是较为热门的一个话题。AOP,国内大体译做“ 面向切面编程”。
“面向切面编程”,这样的名字并非很是容易理解,且容易产生一些误导。有些人认为“OOP/OOD11即将落伍, AOP是新一代软件开发方式”。显然,发言者并无理解AOP的含义。Aspect,的确是“方面”的意思。不过,汉语传统语义中的“方面”,大多数状况下指的是一件事情的不一样维度、或者说不一样角度上的特性,好比咱们常说:“这件事情要从几个方面来看待”,每每意思是:须要从不一样的角度来看待同一个事物。这里的“方面”,指的是事物的外在特性在不一样观察角度下的体现。而在AOP中,Aspect的含义,可能更多的理解为“切面”比较合适。
能够经过预编译方式和运行期动态代理实如今不修改源代码的状况下给程序动态统一添加功能的一种技术。AOP实际是GoF设计模式的延续,设计模式孜孜不倦追求的是 调用者和被调用者之间的解耦,提升代码的灵活性和可扩展性,AOP能够说也是这种目标的一种实现。
在Spring中提供了面向切面编程的丰富支持,容许经过分离应用的业务逻辑与系统级服务(例如审计(auditing)和 事务(transaction)管理)进行 内聚性的开发。 应用对象只实现它们应该作的——完成业务逻辑——仅此而已。它们并不负责(甚至是意识)其它的系统级关注点,例如 日志或事务支持。
 

主要功能

日志记录,性能统计,安全控制,事务处理, 异常处理等等。
 

主要意图

将日志记录,性能统计,安全控制,事务处理, 异常处理等代码从业务逻辑代码中划分出来,经过对这些行为的分离,咱们但愿能够将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
 

AOP/OOP

区分

AOP、OOP在字面上虽然很是相似,但倒是面向不一样领域的两种设计思想。OOP( 面向对象编程针对业务处理过程的实体及其属性和行为进行抽象封装,以得到更加清晰高效的 逻辑单元划分。
而AOP则是针对业务处理过程当中的切面进行提取,它所面对的是处理过程当中的某个步骤或阶段,以得到逻辑过程当中各部分之间低 耦合性的隔离效果。这两种设计思想在目标上有着本质的差别。
上面的陈述可能过于理论化,举个简单的例子,对于“雇员”这样一个 业务实体进行封装,天然是OOP/OOD的任务,咱们能够为其创建一个“Employee”类,并将“雇员”相关的属性和行为封装其中。而用AOP设计思想对“雇员”进行封装将无从谈起。
一样,对于“权限检查”这一动做片段进行划分,则是AOP的目标领域。而经过OOD/OOP对一个动做进行封装,则有点不三不四。
换而言之,OOD/OOP面向名词领域,AOP面向动词领域。
 

关系

不少人在初次接触 AOP 的时候可能会说,AOP 能作到的,一个定义良好的 OOP 的接口也同样可以作到,我想这个观点是值得商榷的。AOP和定义良好的 OOP 的接口能够说都是用来解决而且实现需求中的横切问题的方法。可是对于 OOP 中的接口来讲,它仍然须要咱们在相应的模块中去调用该接口中相关的方法,这是 OOP 所没法避免的,而且一旦接口不得不进行修改的时候,全部事情会变得一团糟;AOP 则不会这样,你只须要修改相应的 Aspect,再从新编织(weave)便可。 固然,AOP 也绝对不会代替 OOP。核心的需求仍然会由 OOP 来加以实现,而 AOP 将会和 OOP 整合起来,以此之长,补彼之短。
 

应用举例

假设在一个应用系统中,有一个共享的数据必须被并发同时访问,首先,将这个 数据封装数据对象中,称为Data Class,同时,将有多个访问类,专门用于在同一时刻访问这同一个数据对象。
为了完成上述并发访问同一资源的功能,须要引入锁Lock的概念,也就是说,某个时刻,当有一个访问类访问这个数据对象时,这个数据对象必须上锁Locked,用完后就当即解锁unLocked,再供其它访问类访问。
使用传统的编程习惯,咱们会建立一个 抽象类,全部的访问类继承这个抽象父类,以下:
abstract class Worker {
    abstract void locked();
    abstract void accessDataObject();
    abstract void unlocked();
}
accessDataObject()方法须要有“锁”状态之类的相关代码。
Java只提供了单继承,所以具体访问类只能继承这个父类,若是具体访问类还要继承其它父类,好比另一个如Worker的父类,将没法方便实现。
重用被打折扣,具体访问类由于也包含“锁”状态之类的相关代码,只能被重用在相关有“锁”的场合,重用范围很窄。
仔细研究这个应用的“锁”,它其实有下列特性:
“锁”功能不是具体访问类的首要或主要功能,访问类主要功能是访问数据对象,例如读取数据或更改动做。
“锁”
“锁”功能实际上是这个系统的一个纵向切面,涉及许多类、许多类的方法。如右图:
 
所以,一个新的程序结构应该是关注系统的纵向切面,例如这个应用的“锁”功能,这个新的程序结构就是aspect(方面)
在这个应用中,“锁”方面(aspect)应该有如下职责:
提供一些必备的功能,对被访问对象实现加锁或解锁功能。以保证全部在修改 数据对象的操做以前可以调用lock()加锁,在它使用完成后,调用unlock()解锁。
 

应用范围

很明显, AOP很是适合开发J2EE容器服务器,JBoss 4.0正是使用AOP框架进行开发。
具体功能以下:
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling  错误处理
Lazy loading 延时加载
Debugging 调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization性能优化
Persistence 持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务
【AOP有必要吗?】
固然,上述应用范例在没有使用AOP状况下,也获得了解决,例如JBoss 3.XXX也提供了上述应用功能,而且没有使用AOP。
可是,使用AOP可让咱们从一个更高的抽象概念来理解软件系统,AOP也许提供一种有价值的工具。能够这么说:由于使用AOP结构,JBoss 4.0的源码要比JBoss 3.X容易理解多了,这对于一个大型复杂系统来讲是很是重要的。
从另一个方面说,好像不是全部的人都须要关心AOP,它多是一种架构设计的选择,若是选择J2EE系统,AOP关注的上述通用方面都已经被J2EE容器实现了,J2EE应用系统开发者可能须要更多地关注行业应用方面aspect。
传统的程序一般表现出一些不能天然地适合单一的 程序模块或者是几个紧密相关的程序模块的行为,AOP 将这种行为称为横切,它们跨越了给定编程模型中的典型职责界限。横切行为的实现都是分散的, 软件设计师会发现这种行为难以用正常的逻辑来思考、实现和更改。最多见的一些横切行为以下面这些:
日志记录,跟踪,优化和监控
事务的处理
持久化
性能的优化
资源池,如 数据库链接池的管理
系通通一的认证、权限管理等
应用系统的异常捕捉及处理
针对具体行业应用的横切行为
前面几种横切行为都已经获得了密切的关注,也出现了各类有价值的应用,但也许从此几年,AOP 对针对具体行业应用的贡献会成为使人关注的焦点。
 

实现项目

AOP是一个概念,并无设定具体语言的实现,它能克服那些只有单继承特性语言的缺点(如Java),AOP具体实现有如下几个项目:
AspectJ (TM): 建立于Xerox PARC. 有近十年历史,成熟
缺点:过于复杂;破坏封装;须要专门的Java 编译器
动态AOP:使用JDK的动态代理API或 字节码Bytecode处理技术。
基于动态代理API的具体项目有:
JBoss 4.0 JBoss 4.0服务器
基于字节码的项目有:
aspectwerkz ,spring

 

做用

面向过程编程离咱们已经有些遥远, 面向对象编程正主宰着软件世界。当每一个新的 软件设计师都被要求掌握如何将需求功能转化成一个个类,而且定义它们的 数据成员、行为,以及它们之间复杂的关系的时候,面向切面编程(Aspect-Oriented Programming,AOP)为咱们带来了新的想法、新的思想、新的模式。
若是说面向对象编程是关注将需求功能划分为不一样的而且相对独立,封装良好的类,并让它们有着属于本身的行为,依靠继承和 多态等来定义彼此的关系的话;那么面向切面编程则是但愿可以将通用需求功能从不相关的类当中分离出来,可以使得不少类共享一个行为,一旦发生变化,没必要修改不少类,而只须要修改这个行为便可。
面向切面编程是一个使人兴奋不已的新模式。就开发软件系统而言,它的影响力必将会和有着数十年应用历史的 面向对象编程同样巨大。 面向切面编程和面向对象编程不但不是互相竞争的技术并且彼此仍是很好的互补。面向对象编程主要用于为同一对象层次的公用 行为建模。它的弱点是将公共行为应用于多个无关对象模型之间。而这偏偏是面向切面编程适合的地方。有了 AOP,咱们能够定义交叉的关系,并将这些关系应用于跨模块的、彼此不一样的对象模型。AOP 同时还可让咱们层次化功能性而不是嵌入功能性,从而使得代码有更好的可读性和易于维护。它会和面向对象编程合做得很好。
 

实现

AOP 是一个概念,一个规范,自己并无设定具体语言的实现,这实际上提供了很是广阔的发展的空间。AspectJ是AOP的一个很悠久的实现,它可以和 Java 配合起来使用。
介绍 AspectJ 的使用和编码不是本文的目的,你能够在 Google 上找到不少有关它的材料。
这里只是重温 AspectJ 中几个必需要了解的概念:
Aspect: Aspect 声明相似于 Java 中的类声明,在 Aspect 中会包含着一些 Pointcut 以及相应的 Advice。
Joint point:表示在程序中明肯定义的点,典型的包括方法调用,对类成员的访问以及 异常处理程序块的执行等等,它自身还能够嵌套其它 joint point。
Pointcut:表示一组 joint point,这些 joint point 或是经过逻辑关系组合起来,或是经过通配、 正则表达式等方式集中起来,它定义了相应的 Advice 将要发生的地方。
Advice:Advice 定义了在 pointcut 里面定义的程序点具体要作的操做,它经过 before、after 和 around 来区别是在每一个 joint point 以前、以后仍是代替执行的代码。
下面要讨论的这些问题,也许正是接触了 AOP 以后所困惑的。
AOP 帮助咱们解决了新的问题没有?
AOP 并无帮助咱们解决任何新的问题,它只是提供了一种更好的办法,可以用更少的工做量来解决现有的一些问题,而且使得系统更加健壮,可维护性更好。同时,它让咱们在进行系统架构和 模块设计的时候多了新的选择和新的思路。
 
 

工业化应用

这个问题很难回答,其实最好的答案就是尝试,用成功的项目或是产品来回答。Jboss 4.0 就是彻底采用 AOP 的思想来设计的 EJB 容器,它已经经过了 J2EE 的认证,而且在工业化应用中证实是一个优秀的产品。相信在不远的未来,会出现更多采用 AOP 思想设计的产品和行业应用。
 
 

小结

AOP 正向咱们走来,咱们须要关注的是怎么样使得它可以为咱们的软件系统的设计和实现带来帮助。本文旨在给你们一点启发,可以在更多的领域更深刻的应用 AOP 的思想。
二、
2.返回顶部
 
3.返回顶部
 
4.返回顶部
 
5.返回顶部
一、
二、
 
6.返回顶部
 
warn 做者:ylbtech
出处:http://ylbtech.cnblogs.com/
本文版权归做者和博客园共有,欢迎转载,但未经做者赞成必须保留此段声明,且在文章页面明显位置给出原文链接,不然保留追究法律责任的权利。
相关文章
相关标签/搜索