AspectJ是一个面向切面的AOP框架,AOP的织入方式分为编译期织入、装载期织入、运行期织入。编译期织入是指在类编译期间利用特殊编译将切面织入到类中,这样生成到字节码中已经包含了切面;装载期织入是指在字节码加载到虚拟机时将切面织入到类中。
下面给出一个AspectJ使用示例,spark的rdd类中由很多写hdfs文件的方法,为了保证spark的执行效率,需要对这些方法进行屏蔽。
首先需要创建一个AspectJ切面文件SparkAspectJ.aj(Idea community不支持此功能,需要使用Ultimate版):
package cn.tongdun.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="cn.tongdun.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"),运行程序,可以发现抛出异常,表明定义的增加已被织入,