AspectJ使用示例

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"),运行程序,可以发现抛出异常,表明定义的增加已被织入,

AspectJ是一种强大的面向切面编程(AOP)框架,它允许开发者编写独立于业务逻辑的模块,称为"切面"(Aspect),来处理横切关注点,如日志记录、事务管理等。在AspectJ中,`@Around`注解用于定义环绕通知,这是一种在目标方法执行前后都会执行的行为。 下面是一个简单的LogAdvice环绕通知方法的使用示例: ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; @Aspect @Component public class LoggingAspect { @Around("execution(* com.example.service.*.*(..))") // 定义切入点表达式,这里针对com.example.service包及其所有类的方法 public Object logBeforeAfter(ProceedingJoinPoint joinPoint) throws Throwable { long start = System.currentTimeMillis(); // 记录开始时间 try { // 执行环绕通知前的操作,比如打印日志 System.out.println("Before method execution: " + joinPoint.getSignature().getName()); // 调用目标方法 return joinPoint.proceed(); // 使用joinPoint的proceed()方法继续执行原方法 } finally { long end = System.currentTimeMillis(); // 执行环绕通知后的操作,如记录结束时间和日志 System.out.println("After method execution: " + joinPoint.getSignature().getName()); System.out.println("Method took " + (end - start) + "ms to execute."); } } } ``` 在这个例子中,当`com.example.service`包下的任何方法被调用时,都会先执行环绕通知里的`logBeforeAfter`方法,然后才是实际方法的执行。完成后,还会执行`finally`块中的通知,无论是否发生异常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值