AspectJ使用示例

来源:互联网 发布:武汉淘宝商学院骗局 编辑:程序博客网 时间:2024/06/11 00:34

AspectJ是一个面向切面的AOP框架,AOP的织入方式分为编译期织入、装载期织入、运行期织入。编译期织入是指在类编译期间利用特殊编译将切面织入到类中,这样生成到字节码中已经包含了切面;装载期织入是指在字节码加载到虚拟机时将切面织入到类中。

下面给出一个AspectJ使用示例,spark的rdd类中由很多写hdfs文件的方法,为了保证spark的执行效率,需要对这些方法进行屏蔽。


首先需要创建一个AspectJ切面文件SparkAspectJ.aj(Idea community不支持此功能,需要使用Ultimate版):

package com.iflytek.aspect;public aspect SparkAspect {    public pointcut saveMethod() : execution(public void org.apache.spark.rdd.*.save*(*));    before() : saveMethod() {        throw new RunTimeException(thisJoinPoint.getSignature().toString());    }}

定义的切入点为public org.apache.spark.rdd.*.save*(*) 含义为org.apache.spark.rdd包中任意类中以save开发的方法并且参数任意

接着需要在resource目录下的META-INF目录中创建一个aop.xml文件


<aspectj>    <aspects>        <aspect name="com.iflytek.aspect.SparkAspect"/>    </aspects></aspectj>

在Idea中安装AspectJ Support插件,并且在Preferences中的Compiler->Java Compiler选择中选择ajc,其中的Path to ajc compiler选项选择apectjtools.jar。最后在启动参数VM oprion中添加-javaagent:aspectjweaver.jar。

写一个测试用例,spark.sql("select * from user").rdd.saveAsTextFile("test"),运行程序,可以发现抛出异常,表明定义的增加已被织入,

1 0
原创粉丝点击