面向切面架构设计思想在J2EE技术平台中的具体实现和应用实例

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

如下示图为Struts 2框架的系统架构示图,Struts 2框架通过应用前端控制器组件完成对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(Inversion of Control)模式来实现面向切面AOP技术,当然它也借助了Java语言中的动态代理和反射等方面的技术。

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

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

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

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

(3)利用Spring AOP实现J2EE EJB组件中所倡导的分离”业务逻辑组件”和”通用技术服务组件”

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

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

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

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

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

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

目前Acegi已经成为Spring Security的安全认证框架,读者可以在Spring框架的官方 站https://spring.io/上下载系统包文件。如下示图为Spring框架的官方 站页面局部截图。

7、面向切面AOP思想在Hibernate O/R Mapping框架中的应用

Hibernate框架通过其事件框架允许应用程序在系统的持久层功能实现中能响应特定的内部事件,从而实现某些通用的功能或者对Hibernate框架本身的功能进行扩展。Hibernate框架中的事件框架主要是由监听器和拦截器技术两个部分所组成。

(1)Hibernate框架中的拦截器技术

Hibernate框架中的拦截器机制是对Spring框架中所支持的业务层类对象实例管理容器中的通知(Advice)形式的拦截器机制的有益补充,使得开发人员可以在更低层次(如系统的持久层中)上应用面向切面AOP的设计思想。

拦截器组件技术为开发人员提供了从会话(Session)回调(Callback)应用程序(Application)的机制,这种回调机制可以允许应用程序在持久化对象实例被”保存”、”更新”、”删除”或是”加载”操作之前,开发人员能够检查并(或)修改持久化对象实例中的有关成员属性的值。

(2)Hibernate框架中的监听器技术

在Hibernate框架中不仅应用面向切面的设计思想为开发人员提供了拦截器组件技术的支持,也还提供有监听器技术——它可以替代拦截器或者作为拦截器的功能补充来使用。

Hibernate框架API中的Session接口的每个方法都提供有对应的事件——比如LoadEvent和FlushEvent等。当Session接口中的某个数据访问方法被调用时,Hibernate框架中的事件处理机制会生成对应的事件,并激活对应的事件监听器。

因此,在应用系统的持久层开发实现中,可以应用Hibernate框架中的监听器来生成审计日志——审计主要是对数据库中重要数据的更新历史进行记录。尽管数据库系统中所提供的触发器技术也可以用于生成审计日志,但是它不支持跨数据库平台的功能要求,所以一般采用Hibernate框架中的监听器实现这样的功能。

如下示图为Hibernate框架的官方 站http://hibernate.org/的页面局部截图,读者可以在官方 站上下载Hibernate框架的系统包文件,也可以在线阅读相关的技术帮助文档。

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年10月19日
下一篇 2020年10月19日

相关推荐