spring 未触发 aop 切入点

spring aop pointcut not triggered

问题是@Before 和@AfterReturning 正在工作,但切入点不是这种情况。

这是我的方面。

作为 springboot 服务的一部分,我想要做的是使用第一种方法 profile 触发切入点以显示执行时间和其他内容。

我是不是漏掉了什么?

package com.myproj.service.myagg.aop;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;

/**
 * Created by shammami on 26/05/2017.
 */
@Aspect
@Component
public class LoggingService {

    @Pointcut("execution(public void com.myproj.service.myagg.listener.MyMessageConsumer.handleMessage(..))")
    public Object profile(ProceedingJoinPoint pjp) throws Throwable {
        StopWatch stopWatch = new StopWatch();
        stopWatch.start();
        boolean isExceptionThrown = false;
        try {
            // execute the profiled method
            return pjp.proceed();
        } catch (RuntimeException e) {
            isExceptionThrown = true;
            throw e;
        } finally {
            stopWatch.stop();
            StopWatch.TaskInfo taskInfo = stopWatch.getLastTaskInfo();
            // Log the method's profiling result
            String profileMessage = taskInfo.getTaskName() + ": " + taskInfo.getTimeMillis() + " ms" +
                    (isExceptionThrown ? " (thrown Exception)" : "");
            System.out.println(profileMessage);
        }
    }

    @Before("execution(public void com.myproj.service.myagg.listener.MyMessageConsumer.handleMessage(..))")
    public void before(JoinPoint joinPoint) {
        System.out.println("Started: " + joinPoint.getStaticPart().getSignature().toLongString());
    }

    @AfterReturning("execution(public void com.myproj.service.myagg.listener.MyMessageConsumer.handleMessage(..))")
    public void completed(JoinPoint joinPoint) {
        System.out.println("Completed: " + joinPoint.getStaticPart().getSignature().toLongString());
    }
}

当你用@Pointcut注释某些东西时,你基本上是在定义切入点签名,你不能在那里做任何类型的处理。您需要做的是创建另一个方法,该方法具有所有处理细节并使用您在上面评估的切入点签名。因此,

@Pointcut("execution(public void com.myproj.service.myagg.listener.MyMessageConsumer.handleMessage(..))")
public void myPointcutSignature(){
//This basically has nothing :)  
}

@Around("myPointcutSignature")
public Object profile(ProceedingJoinPoint pjp) throws Throwable {
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    boolean isExceptionThrown = false;
   //And the remaining code
  -------
 }

希望这能奏效。还要记住,ProceedingJoinPoint 只能与@Around 建议一起使用。