快速业务通道

Java中实现基于Aspectwerkz的AOP开发 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
mple; 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 name="persist" class="example.PersistenceAdvice" deployment-model="perJVM"/>

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

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

<aspect name="servlet"> <pointcut-def name="all" type="method" pattern="* example.*Servlet.doGet(..)"/> <bind-advice pointcut="all"> <advice-ref name="persist"/> </bind-advice> </aspect>

下面我们一行一行地分析这段代码:

⑴ 我们创建了一个叫做servlet的aspect。如有必要,我们可以创建任意数量的aspect。

⑵ 在第二行,我们创建了一个叫做all的point-cut,它只适用于方法(type="method")。

⑶ 第三行我们用一个正则表达式规定了把advice应用到哪里。在这个例子中,我们指出应用advice的条件是:不管返回值的类型是什么(第一个“*”),名称以servlet结尾(*servlet)且包含一个带任意参数的doGet方法(doGet(..))的example包里面的类。

⑷ 在第四行,我们告诉Aspectwerkz编译器要把后面的advice应用到所有的point-cut。

⑸ 在这里我们声明要使用的advice是persist。

现在我们知道了如何映射point-cut与advice创建出aspect,下面来看看一个提供advice的类的实例。在映射文件中,我们注册了一个example.PersistenceAdvice类型的advice,下面是该类型的源代码:

package example; import javax.servlet.http.*; import org.codehaus.aspectwerkz.advice.*; import org.codehaus.aspectwerkz.joinpoint.*; public class PersistenceAdvice extends AroundAdvice {   public PersistenceAdvice() {    super();   }   public Object execute(final JoinPoi

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号