.

面向切面AOP架构设计思想在J2EE技术

软件项目实训及课程设计指导——面向切面AOP架构设计思想在J2EE技术平台中的具体实现和应用示例

1、J2EE容器服务的技术规范其实是对面向切面AOP的设计思想的具体应用

面向切面所倡导的横向分离解藕的设计思想其实在J2EE技术平台中早已经被应用了,并且在遵守J2EE规范的容器中也已经具体地实现了。因为,在企业应用系统的开发中,事务机制、安全机制、对象缓存等都是企业应用系统中的通用应用要求,而对这些功能的实现没有必要由软件应用系统的开发者重复地进行功能实现。并且对这些功能的设计和开发实现是有一定的技术实现难度、并需要时间调试和运行经验的积累。

因此,有必要将这些通用的基础功能服务从具体的软件应用系统中分离出来,而专门由应用服务器平台加以实现和提供,并形成了专门的J2EE容器服务的规范。

2、面向切面AOP思想在J2EEWeb过滤器Filter组件中的应用

(1)J2EEWeb组件技术中的过滤器(Filter)组件

J2EE技术平台中的Web过滤器是一种J2EEWeb组件,它拦截用户通过Web浏览器发出的请求输入和后台服务器程序的响应输出,以便查看、提取或以某种方式操作正在客户机(一般为Web浏览器)和服务器之间交换的Http请求数据。

应用J2EEWeb过滤器组件技术同样也能够达到面向切面AOP所倡导的分离“技术问题实现”和“业务问题实现”的设计效果。因此,在J2EEWeb应用系统的开发中可以将日志记录、安全验证和会话处理等有关软件应用系统中的“技术问题实现”的功能代码放在过滤器组件中,这样在软件应用系统业务层中将不需要再重复地编程这些功能实现代码。

(2)过滤器(Filter)组件是动态可配置化的Web表示层组件

如下示图为某个软件应用系统中在系统web.xml部署描述文件中定义某个J2EEWeb过滤器组件的应用示例。J2EEWeb过滤器组件提供一种面向对象的模块化机制,用以将软件应用系统中公共任务封装到可插入的组件中,这些过滤器组件通过在web.xml配置文件中的filter标签声明,并动态地处理——从而最终实现面向切面AOP的应用效果。

因此,J2EEWeb过滤器组件可以根据应用系统的需要添加或删除,而不会破坏软件应用系统中的控制器Servler组件或JSP页面中相关的功能实现程序。

(3)过滤器(Filter)组件的工作原理

如下示图为J2EEWeb过滤器组件对URL请求和响应进行转换的原理示图,从该原理示图中可以了解到J2EEWeb过滤器组件不仅可以实现对URL请求(Request)进行转换,也可以对Web服务器端的响应输出(Response)进行转换。因此,J2EEWeb过滤器组件在Web应用系统中可以提供双向的拦截和过滤功能。

多个J2EEWeb过滤器组件可以相互串接形成过滤器链——实现多层次的“过滤”处理,过滤器组件不仅可以对用户的请求进行过滤处理,同时也可以对服务器端向客户发送的响应进行过滤处理。如下示图为多个J2EEWeb过滤器组件相互串接形成过滤器链的工作原理示图。

(4)过滤器(Filter)组件在应用中的不足

但J2EEWeb过滤器组件技术的“拦截和过滤功能”只适用于Web表示层中的URL地址的拦截和过滤,而无法实现对业务层或者持久层等软件应用系统底层的组件中的功能方法进行拦截和过滤,因此在应用方面是有一定的限制。这是因为J2EEWeb过滤器组件技术是构建在J2EEServlet组件技术基础上的,因此同样依赖于J2EEWeb容器而无法脱离J2EEWeb容器而应用于软件应用系统的业务层或者持久层中。

如下示图中的代码示例为某个软件应用系统中通过应用Web过滤器组件实现对用户访问进行验证和控制的应用示例。

当然,应用面向切面AOP的某种具体实现如SpringAOP中的拦截器组件不仅可以实现对URL地址的拦截(通过监控控制层如Servlet组件或者Struts系统中的Action类中的方法),也可以实现对软件应用系统中业务层或者持久层等应用系统底层的组件中的方法进行拦截。

3、面向切面AOP思想在J2EEWeb监听器Listener组件中的应用

(1)J2EEWeb组件技术中的Web监听器(Listener)组件

在Web应用系统的开发中,还可以部署一些特殊的Servlet组件类,通过它们从而实现对Web应用中的上下文信息、会话信息等的监听,最终实现在服务器后台自动地完成某些特定的应用功能。

(2)为什么在J2EEServlet容器中要提供Web监听器组件

为了方便基于J2EE系统平台下的Web应用系统开发人员通过对Web应用服务器工作状态相关信息的监听,从而可以在Web服务器的后台自动启动某些应用功能程序,完成一些特殊的应用。

(3)如何创建Web监听器(Listener)组件

Web监听器(Listener)组件也是一种特殊的Servlet组件类,同样也需要实现WebServlet容器中所提供的相关接口如ServletContextListener和HttpSessionListener等。

比如,实现ServletContextListener接口的监听器组件可以在Web应用系统的启动和关闭时插入附加的功能行为实现,同样实现HttpSessionListener接口的监听器组件可以监控用户的会话状态,在会话开始或者结束时插入附加的功能行为实现。

而这些附加的功能实现代码并不需要直接包含在各个业务功能处理代码中,两者相互分离、并且可以动态地配置改变。如下示图表示某个Web应用系统在部署描述文件web.xml中部署某个Web监听器组件的代码示例(由其中的listener标签定义),但由于Web监听器组件的监听是针对整个Web应用程序而言的,因此不需要象J2EEWeb过滤器Filter组件那样设置filter-mapping标签。

(4)应用Web监听器组件实现  加载Web应用系统的全局工作参数的应用示例

在Web应用系统中一般都会存在有许多全局工作参数,为了减少对全局工作参数的重复解析,可以在Web应用系统启动时一次性加载这些配置参数并缓存起来,在后台的Servlet及业务功能的JavaBean组件中获得这些工作参数。

本示例实现的主要方法是利用Web监听器组件技术设计一个Web监听器组件,该组件类实现javax.servlet.ServletContextListener接口。如下示例图为本示例程序的执行结果的局部截图。为了验证本程序的功能正确性,将在Web监听器组件中获得的全局工作参数(它们来自于XML配置文件)在控制台中输出,完全与原始的XML配置文件中的配置参数相同。

4、Struts2MVC框架也是基于面向切面AOP设计思想而设计和实现的

Struts2MVC框架是对OpenSymphony社区开发的WebWork框架的升级,而不是对ApacheStruts1.X版架构的Struts框架的升级。虽然Struts2框架提供了与基于Struts1.X版架构的原有Struts框架的兼容,但已经不是简单地对它的升级。因为目前的Struts2框架与原先的Struts框架有着完全不同的系统架构设计和API类库。

如下示图为Struts2框架的系统架构示图,Struts2框架通过应用前端控制器组件完成对URL请求的预处理,并调用相关的请求处理的后端业务控制器Action组件;而后端业务控制器Action组件则根据URL请求的类型分别调用不同的业务功能Action组件,完成最终的功能处理,并将处理的结果返送到相关的表现层JSP页面中显示输出。

因此,在Struts2框架中大量地应用了拦截器组件技术在系统后台为应用系统提供许多附加的功能实现,这包括表单属性注入和验证、类型转换和国际化等方面的技术支持。并且也允许开发人员自定义自己特殊功能的拦截器组件,而这些拦截器组件背后的基本思想和技术实现其实就是对面向切面AOP设计思想和原理的具体应用。

在Struts2框架中的前端控制器采用标准的过滤器(Filter)组件实现,逻辑更清晰。StrutsPrepareAndExecuteFilter组件在web.xml配置定义的示例如下:

5、Spring框架通过控制反转(IOC)简化实现AOP

(1)Spring框架应用IoC模式实现面向切面AOP技术

Spring框架完整地提供对面向切面AOP技术的具体实现,而且是通过Spring框架中的控制反转IoC(InversionofControl)模式来实现面向切面AOP技术,当然它也借助了Java语言中的动态代理和反射等方面的技术。

因此,如果在应用系统的设计中应用了Spring框架来创建应用系统中的各个对象实例和管理各个对象之间的关系,则应用系统本身在系统架构设计方面就具有一定的解藕能力,从而也就能够保证应用系统的架构设计结果是具有良好的可扩展性和可重用性。

如下示图为体现某对象和对象之间关系的Spring配置文件示例局部截图,在Spring框架中通过外部文件形式设定对象之间相关联的细节而不是传统程序编程实现中在程序代码中直接创建出对象实例和构建出对象之间的依赖关系。Spring框架应用依赖注入(DI=DependencyInjection)构建出对象之间的依赖关系,而所谓的依赖注入,也就是将组件之间的依赖关系由容器在运行期决定——由容器动态的将某种依赖关系注入到目标组件之中。

(2)应用Spring框架给系统开发所带来的主要优点

面向对象OOP中所提供的“接口”、“抽象类”以及“多态性”,从技术上保证了“面向抽象编程”可行性,从而达到“松藕合”目的;但Spring框架则从架构层面上使得达到上述目标的手段变得易行。因此,Spring框架给系统开发所带来的主要优点是:“解耦”和“脱离容器”。

(3)利用SpringAOP实现J2EEEJB组件中所倡导的分离“业务逻辑组件”和“通用技术服务组件”

SpringAOP是对AOP(面向方面编程)的具体实现,借助于SpringAOP中所提供的各种形式的拦截器(通知)技术,开发者能够实现以声明的方式使用企业级服务——比如安全性服务、事务服务、日志等,从而达到类似J2EEEJB“容器”提供基础功能服务的目标。

但开发人员对SpringAOP技术中的方面(Aspect)组件的编程开发则变成对通知组件(在Spring中称为Advice)的开发——AOP拦截器,这些拦截器组件可以在任何对象的方法调用前/后加入开发者自定义的行为;并且在SpringAOP的实现规范中,为开发人员提供了四种不同形式的通知组件的接口定义。它们分别是MethodInterceptor接口(环绕通知Advice)、MethodBeforeAdvice接口(前置通知Advice)、ThrowsAdvice接口(异常Advice)、AfterReturningAdvice接口(后置通知Advice)和IntroductionInterceptor接口(引入通知Advice)。

另外,在Spring框架中还通过AOP机制为开发人员提供了多种不同形式的通用技术服务功能的支持——如声明方式的事务(Transaction)控制、代码调试(Debug)、类加载分析和并发控制、简单的性能监控等功能支持。

6、Acegi是基于Spring框架的一个开源的安全认证框架

对于一个典型的Web应用,完善的认证和授权机制是必不可少的,而Acegi(AcegiSecuritySystemforSpring,基于Spring框架实现的安全框架)则为J2EEWeb应用系统的开发者提供了一个Web应用安全的完整解决方案,并提供了一些缺省的实现和允许开发者根据具体的应用需求进行相应的功能扩充。

由于Acegi是基于Spring框架实现的,所以可以和现有的基于Spring框架的应用系统相互集成。当然,它也可以和其他J2EEWeb应用系统进行集成。实现认证和授权最常用的方法是通过J2EEWeb过滤器(Filter)组件,Acegi亦是如此、并且也是基于AOP的设计思想实现的。

目前Acegi已经成为SpringSecurity的安全认证框架,读者可以在Spring框架的官方网站


转载请注明:http://www.abachildren.com/sstx/1458.html