为什么要区分JEE容器和JEE应用系统? 我们知道JEE应用系统只有部署在JEE容器中才能运行那么为什么划分为JEE容器和JEE应用系统? 通过对JEE容器运行机制的分析我们可以发现实际上JEE容器分离了一般应用系统的一些通用功能例如事务机制安全机制以及对象池或线程池等性能优化机制 这些功能机制是每个应用系统几乎都需要的因此可以从具体应用系统中分离出来形成一个通用的框架平台而且这些功能机制的设计开发有一定难度同时运行的稳定性和快速性都非常重要必须经过长时间调试和运行经验积累而成因此形成了专门的JEE容器服务器产品如Tomcat JBossWebsphereWebLogic等 从JEE系统划分为JEE容器和JEE应用系统两个方面我们已经看到一种分散关注的思路(separation of concerns) 分散关注 将通用需求功能从不相关类之中分离出来;同时能够使得很多类共享一个行为一旦行为发生变化不必修改很多类只要修改这个行为就可以 AOP就是这种实现分散关注的编程方法它将“关注”封装在“方面”中 AOP是什么? AOP是OOP的延续是Aspect Oriented Programming的缩写意思是面向方面编程AOP实际是GoF设计模式的延续设计模式孜孜不倦追求的是调用者和被调用者之间的解耦AOP可以说也是这种目标的一种实现 举例假设有在一个应用系统中有一个共享的数据必须被并发同时访问首先将这个数据封装在数据对象中称为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应用范围 很明显AOP非常适合开发JEE容器服务器目前JBoss 正是使用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 XXX也提供了上述应用功能但是没有使用AOP 但是使用AOP可以让我们从一个更高的抽象概念来理解软件系统AOP也许提供一种有价值的工具可以这么说因为使用AOP结构现在JBoss 的源码要比JBoss X容易理解多了这对于一个大型复杂系统来说是非常重要的 从另外一个方面说好像不是所有的人都需要关心AOP它可能是一种架构设计的选择如果选择JEE系统AOP关注的上述通用方面都已经被JEE容器实现了JEE应用系统开发者可能需要更多地关注行业应用方面aspect AOP具体实现 AOP是一个概念并没有设定具体语言的实现它能克服那些只有单继承特性语言的缺点(如Java)目前AOP具体实现有以下几个项目 AspectJ (TM)创建于Xerox PARC 有近十年历史技术成熟 缺点过于复杂;破坏封装;需要专门的Java编译器 动态AOP使用JDK的动态代理API或字节码Bytecode处理技术 基于动态代理API的具体项目有 JBoss JBoss 服务器 nanning 基于字节码的项目有 aspectwerkz spring |