快速业务通道

Java面向方面编程概述 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-23
ain(String[] args) { POJO pojo = new POJO(); pojo.helloWorld(); } } TracingInterceptor将监听main ()、POJO ()和helloWorld ()的调用。输入为: Entering method: main Entering constructor: public POJO() Leaving constructor: public POJO() Entering method: helloWorld Hello World! Leaving method: helloWorld Leaving method: main

你可以到http://www.jboss.org/index.html?module=html&op=userdisplay&id=developers/projects/jboss/aop去下载JBoss AOP和例程代码。 编译和执行:

$ cd oreilly-aop/example1 $ export CLASSPATH=.;jboss-common.jar;jboss-aop.jar;javassist.jar $ javac *.java $ java -Djava.system.class.loader=org.jboss.aop.standalone.SystemClassLoader POJO

JBoss AOP操作字节码,附加到监听器上。因为没有编译步骤,AOP运行时间必须全局控制ClassLoader。所以如果你在JBoss应用程序服务器以外运行的时候,你必须使用一个JBoss指定的classloader覆盖系统classloader。

例2、使用元数据

TracingInterceptor不追踪字段访问,因为它有点太冗长。对于开发者来说,实现get()和set()方法来封装字段访问是一个惯例。如果TracingInterceptor可以过滤而不是跟踪这些方法,那将非常好。 这个例子向你说明,如何使用JBoss AOP元数据来实现基于一个每方法结构的过滤。通常,元数据被用于更复杂的,如定义事务属性、每方法安全角色或者持久映射,但是这个例子将足以说明元数据如何被用于一个能使用AOP的应用程序。

定义类元数据

为了添加这个过滤功能,我们将提供了一个标志,你可以使用它来关闭跟踪。 我们将回到我们的AOP XML文件,来定义将删除对get()和set()方法的跟踪的标记。 实际上,跟踪main()函数也有点意义不大,所以让我们也把这个跟踪给过滤掉。

<?xml version="1.0" encoding="UTF-8"> <aop> <class-metadata group="tracing" class="POJO"> <method name="(get.*)|(set.*)"> <filter>true</filter> </method> <method name="main"> <filter>true</filter> </method> </class-metadata> </aop>

上面的XML定义一组名为tracing的属性。 过滤属性将被附加到每个以get或set开头的方法。 正则表达式格式使用JDK 1.4定义的表达式。 这个元数据可以在TracingInterceptor里通过Invocation对象访问。

访问元数据

对于有用的元数据,它必须在运行时间可访问。 类元数据可以通过Invocation对象访问。 为了在我们的例子中使用它,必须稍微修改一下TracingInterceptor。

public class TracingInterceptor implements Interceptor { public String getName() { return TracingInterceptor; } public InvocationResponse invoke(Invocation invocation) throws Throwable { String filter = (String)invocation.getMetaData(tracing, filter); if (filter != null && filter.equals(true)) return invocation.invokeNext(); String message = null; if (invocation.getType() == InvocationType.METHOD) { Method method = MethodInvocation.getMethod(invocation); message = method: + method.getName(); } else if (invocation.getType() == InvocationType.CONSTRUCTOR) { Constructor c = ConstructorInvocation.getConstructor(invocation); message = constructor: + c.toString(); } else { // Do nothing for fields. Just too verbose. return invocation.invokeNext(); } System.out.println(Entering + message); // Cont

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站: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号