Java中基于Aspectwerkz的AOP(2)

  在脱机模式下,生成类需要二个步骤。第一步是用标准的编译器编译,第二步是重点——以脱机模式运行AWcompiler编译器,让它处理新生成的类。编译器将修改这些类的字节码,根据一个XML文件的定义,在适当的point-cut插入advice。脱机模式的优点是AWcompiler生成的类能够在任何JVM 1.3以上的虚拟机运行,本文下面要用的就是这种模式,因为它不需要对Tomcat作任何修改,只要对构造过程稍作修改就可以照搬到大多数现有的项目。

  四、安装

  本文将以一个简单的Web应用程序为例,它用Ant编译,部署在Tomcat 4+ Servlet容器上。下面我们假定读者己准备好上述环境,包括JVM 1.3+,同时Tomcat被设置成从webapps文件夹自动部署应用,自动将WAR扩展到目录(这是Tomcat默认的操作方式,因此只要你尚未修改Tomcat的运行方式,下面的范例可直接运行)。我们将把Tomcat的安装位置称为%TOMCAT_HOME%。

  ⑴ 从下载Aspectwerkz,解开压缩到适当的位置。我们将把这个位置称为%ASPECTWERKZ_HOME%。

  ⑵ 设置%ASPECTWERKZ_HOME%环境变量。

  ⑶ 将Aspectwerkz加入到PATH环境变量,即设置set PATH=%PATH%;%ASPECTWERKZ_HOME%inaspectwerkz

  ⑷ 下载本文的示范程序,将它放入%TOMCAT_HOME%webapps文件夹。

  ⑸ 将Aspectwerkz的运行时类加入到Tomcat的classpath。你可以将它的JAR文件放入示例应用的WEB-INFlib文件夹,或放入%TOMCAT_HOME%commonlib。

五、编译示例应用

  如果你想深入研究一下本文的示例应用,可以解开WAR文件提取它的内容。你会发现根目录下有一个aspectwerkz.xml文件,构造应用时它会被复制到WEB-INF/classes目录。Servlet和advice的源文件在WEB-INF/src目录下,另外还有一个构建这些类的ANT脚本。

  在运行这个示例程序之前,你还要对它进行后期编译。下面是具体的操作步骤:

  ⑴ 在命令行窗口中,转到解开WAR文件的目录。

  ⑵ 输入下面的命令调用AW编译器:aspectwerkz -offline aspectwerkz.xml WEB-INF/classes -cp %TOMCAT_HOME%commonlibservlet.jar。如后期编译顺利通过,应看到下面的输出:

  ( 1 s )

  SUCCESS: WEB-INFclasses

  在构建文件中有一个名称为war的ANT任务,你可以用它重新创建WAR文件。

  六、运行示例应用

  首先启动(或重新启动)Tomcat,然后在浏览器中打开:8080/demo/。

  页面打开后,可以看到一个带二个输入框的HTML表单,一个输入名字,一个输入邮件地址。输入一些数据,然后点击按钮提交表单,出现一个页面显示出联系人信息和一个指向联系人清单的链接。

  七、代码分析

  JSP页面就不分析了,现在我们对它不感兴趣。我们来看看AOPServlet的代码。

  package example;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class AOPServlet extends HttpServlet {
 public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException {
  Person person = new Person();
  if (request.getParameter("name") != null) {
   person.setName(
   request.getParameter("name"));
  }
  if (request.getParameter("email") != null) {
   person.setEmail(
   request.getParameter("email"));
  }
  request.setAttribute("person", person);
  RequestDispatcher rd =request.getRequestDispatcher("/view.jsp");
  rd.forward(request, response);
 }
}

  在这个例子中,Servlet的代码己尽量精简,只包含一些必不可少的代码,如创建了一个绑定请求参数的对象等,但没有持久化操作,不需要额外的imports,它只实现了作为Servlet必须实现的最基本的操作。

  然而,根据说明文档的要求,这个应用程序必须将所有Person类型的对象特久化,所以要为这个应用程序加入一个aspect。为创建这个aspect,我们首先要创建一个aspectwerkz.xml文件并将该文件放入classpath指定的目录。本文示例提供了一个简单的例子,你可以用编辑器打开查看。

  aspectwerkz.xml的第一部份定义了可用的advice,我们可以根据需要加入任意数量的advice:

  <advice-def deployment-model="perJVM"/>

  在这个片段中,我们定义了一个名称为persist的advice,它的类型是example.PersistenceAdvice。最后一个属性定义了该advice的排它性,在这里它的值是perJVM,表示在每一个JVM中只创建该advice的一个实例(有关部署模式的更多说明,请参见Aspectwerkz的文档。

  第二部份开始定义aspect,这里就是我们将advice映射到point-cut创建aspect的地方。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzxgwy.html