怎么样通过Aspectwerkz动态实现AOP?
怎么样通过Aspectwerkz动态实现AOP?
Aspectwerkz动态实现AOP |
目前最成熟、功能最丰富的AOP框架当数AspectJ,AspectJ已成为大多数其它框架跟从的标准。但是,AspectJ也走出了非同寻常的一步,它的实现为Java语言增添了新的关键词。虽然新的语法并不难学,但却意味着我们必须换一个编译器,还要重新配制编辑器,只有这样才能适应新的语法。在规模较大的开发组中,这些要求可能难以办到,因为整个开发小组都会受到影响。由于语言本身的变化,开发小组把AOP技术引入到现有项目的学习周期随之延长。
AspectWerkz 主要特性: 1.运行时和加载时字节码修正:你可以在运行时或编译时轻松的改造任何(旧)应用程序或除了rt.jar以外的外部类库 2.支持join point模型 3.支持Annotation:匹配JavaDoc和JSR-175,支持用户自定义Annotation 4.支持部署多个Aspect定义文件到部署的应用程序(WEB-INF/aop.xml、META-INF/aop.xml) 5.Introduction/内类型声明(也称Mixin),也就是具有添加接口和实现到已存在的类中的能力 6.Annotation定义:定义Aspect使用的运行时Annotation(为JSR-175准备) 7.XML定义:定义Aspect使用的XML;XML可以用来精炼、改写和解析Annotation定义 8.插件式Aspect管理器能够和IoC框架(如Spring或PicoContainer)一起工作 9.四种不同的Advice和Introduction部署模型(范围):perJVM(单模式)、 perClass、perInstance 和perThread 10.Advice和Introduction能够动态部署、反部署或重新部署 11.高性能,使用JIT编译 12.使用Fine-grained模式语言选择join point 13.所有Advice能够和所有的join point和各种混合类型的pointcut 14.脱机变换(可以用作后处理器) 15.Aspect、Advice和Introduction使用POJO编码 16.目标类可以是正规的POJO,也就是不需要接口 17.支持通过定义传递参数给Advice和定义可重用的Advice堆栈 18.元数据被加到类中 19.简单的用法和配置
开始AOP
1)这里我们要在屏幕打印出“Hello AOP!”,看如下代码: //HelloAOP.java public class HelloAOP { public static void main(String args[]) { HelloAOP ha = new HelloAOP(); ha.test(); } public void test() { System.out.println("Hello AOP!"); } } 编译HelloAOP.java文件:javac HelloAOP.java
2)现在我要在输出“Hello AOP!”前后做一些工作,这些工作在运行时会得到调用机会,如果使用AOP术语,我们可以说我们要编写我们的aspect,这个aspect会在运行时被weave into (织入)HelloAOP class。 //MyAspect.java import org.codehaus.aspectwerkz.joinpoint.JoinPoint; public class MyAspect { public void beforeTesting(JoinPoint joinPoint) { System.out.println("before testing..."); } public void afterTesting(JoinPoint joinPoint) { System.out.println("after testing..."); } } javac MyAspect.java
3)织入过程并不简单,我们需要撰写一个描述文件来将aspect和其织入的class中的信息联系起来。 //aop.xml <aspectwerkz> <system id="AspectWerkzExample"> <aspect class="MyAspect"> <pointcut name="testMethod" expression="execution(* HelloAOP.test(..))"/> <advice name="beforeTesting" type="before" bind-to="testMethod"/> <advice name="afterTesting" type="after" bind-to="testMethod"/> </aspect> </system> </aspectwerkz>
4)run it aspectwerkz -Daspectwerkz.definition.file=aop.xml HelloAOP
//output: before testing... Hello AOP! after testing...
Everything is fine! |