共计 4632 个字符,预计需要花费 12 分钟才能阅读完成。
名称含意
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 并没有帮忙咱们解决任何新的问题,它只是提供了一种更好的方法,可能用更少的工作量来解决现有的一些问题,并且使得零碎更加强壮,可维护性更好。同时,它让咱们在进行零碎架构和模块设计的时候多了新的抉择和新的思路。
工业化利用
AOP 利用十分宽泛,具体来说,其实最好的答案就是尝试,用胜利的我的项目或是产品来答复。业内已呈现齐全采纳 AOP 的思维来设计的 EJB 容器,它曾经通过了 J2EE 的认证,并且在工业化利用中证实是一个优良的产品。
小结
AOP 正向咱们走来,咱们须要关注的是怎么样使得它可能为咱们的软件系统的设计和实现带来帮忙。本文旨在给大家一点启发,可能在更多的畛域更深刻的利用 AOP 的思维。