今天,面向方面的程序设计(aspect-oriented programming,aop) 框架试图在企业环境中获得立足之地。这些框架为了得到普遍采用,必须与企业系统中已经在使用的其他框架良好地集成。 本文向开发人员展示了,如何将aspectwerkz aop框架与一些现在常用的框架(如log4j、atlassian 性能剖析器、hibernate和tapestry)相集成。
本文从一个现有的tapestry web应用程序开始。这个应用程序实现两个单独的关注点:日志记录和性能剖析。每个项目都有这些需求,许多项目用log4j做日志记录而用atlassian剖析器框架做性能分析。然后最初的非aop实现被重构,以便使用aspectwerkz框架来分离每个关注点的实现。产生的应用程序代码将会更简单,更容易维护,而最重要的是,更自然,表达能力更强。
本文中描述的所有应用程序和源代码都可以下载得到。
简介
为了证明aop的强大,我们从一个非aop web应用程序开始,并重构它以使用aop。应用程序的前后映像将说明aop是多么易于使用,及方面作为java语言的扩展是多么有用。
示例程序实现了一个示例blog,以允许用户在已有文章上张贴新的文章和评论。它是由多种框架实现的,包括用于web层的tapestry,作为o/r mapping解决方案的hibernate,以及把各部分结合起来的sping框架。日志记录是用log4j框架实现的,而性能是用atlassian剖析器来监控的。
出于演示目的,blog应用程序保持尽可能地简单。尽管很简单,blog应用程序包含了使它像一个“真正的”应用程序的足够功能,因此文中的代码可以应用于现有的企业项目。
本文假定读者对aop概念有基本的理解。aop的初学者应该阅读下面引用的文章和教程。所有的例子都将用运行在bea weblogic jrockit 1.4.2 sdk上的aspectwerk 2.0实现。另外一些可选的环境请参见aspectwerk主站点。
运行示例程序
要运行示例应用程序,需要一个数据库和一个servlet容器。本文假定使用mysql。
安装完必需的软件后,下载并解压示例代码到一个临时目录中。该发行版中有三个文件:
首先,设置mysql来得到所需的数据库。把数据库命名为“blog”,并设置一个口令为“password”的用户id“blog”。然后通过执行blog-ddl.sql脚本来定义模式(在mysql提示符下键入sourceblog-ddl.sql)。
现在我们可以部署应用程序了。blog应用程序的两个版本都被打包成war文件,所以可以直接了当地部署到servlet容器中。
现在可以通过访问网址http://localhost:7001/blog-preaop/blog和http://localhost:7001/blog-postaop/blog来运行应用程序了。试着运行应用程序的一些功能并检查web-inf/classes目录中的源代码。本文的其余部分将详细分析两种实现并着重说明aop方法的优点。
分析最初的blog应用程序
blog应用程序实现了两个横切关注点:日志记录和性能剖析。这些关注点要在贯穿整个应用程序的所有类中实现。让我们看看,利用aop出现以前可用的标准java工具是如何实现这两个关注点的。
日志记录
日志记录的目的是能够在不打开调试器的情况下调试生产应用程序。在我的项目中已经证明很有价值的有,通过记录每个方法的入口和出口来跟踪代码。例如,在hibernateentrydao类中,下面的代码是用来查找所有blog入口的:private static final log log = log.getlog(entryhibernatedao.class); public entry[] findall() { log.enter("findall"); list entries = gethibernatetemplate().find("from entry"); log.exit("findall"); return (entry[])entries.toarray(new entry[] {}); }
当用于整个代码时,将对完全的用户请求产生下面的日志输出:
com.tss.blog.web.applicationservlet info : >service: ’/blog’ com.tss.blog.service.blogsvcimpl info : >findallentries com.tss.blog.persistence.entryhibernatedao info : >findall com.tss.blog.persistence.entryhibernatedao info : <findall com.tss.blog.service.blogsvcimpl info : <findallentries com.tss.blog.web.applicationservlet info : <service:’/blog’
尽管非常冗长,但它对调试生产系统非常有帮助。log4j在优化日志书写方面做得很好,所以性能很少成为问题。因为所有的enter/exit调用都被赋予info优先级,如果web层的性能真的成为问题,那么需要做的只不过是把log4j.preperties中的日志记录优先级阈值更改为warn或更高,而且log4j会丢弃跟踪信息。
Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器