可以@Pointcut和@Around在不同的课程?

问题描述 投票:1回答:1

我是AOP的新手。我在AOP的帮助下制作了一个通用的日志记录API,其中定义了建议。

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
import org.springframework.util.StopWatch;


@Component
@Aspect
public class LogExecutionTime {
  private static final String LOG_MESSAGE_FORMAT = "%s.%s execution time: %dms";
  private static final Log LOG =   LogFactory.getLog(LogExecutionTime.class);

  @Around("myPointCut()")
  public Object logTimeMethod(ProceedingJoinPoint joinPoint) throws Throwable {
    System.out.println("Inside aAdvice LogExecutionTime");
    StopWatch stopWatch = new StopWatch();
    stopWatch.start();
    Object retVal = joinPoint.proceed();
    stopWatch.stop();
    logExecutionTime(joinPoint, stopWatch);
    return retVal;
  }
  private void logExecutionTime(ProceedingJoinPoint joinPoint, StopWatch stopWatch) {
    String logMessage = String.format(LOG_MESSAGE_FORMAT, joinPoint.getTarget().getClass().getName(), joinPoint.getSignature().getName());
    LOG.info(logMessage.toString());
  }
}

现在我已将此jar包含在我的应用程序代码和书写切入点中。

import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

@Component
@Aspect
public class ButterflyPointCut {

    @Pointcut("execution(* com.*.Abc.methodName(..))")
    public void myPointCut(){ 
        System.out.println("Executed");
    }

}

它给出了以下错误。我想知道它是否是因为不同的类。我已经将jar包放在组件扫描中。

 Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut myPointCut
        at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:317)
        at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:217)
        at org.springframework.aop.aspectj.AspectJExpressionPointcut.checkReadyToMatch(AspectJExpressionPointcut.java:190)
        at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:169)
        at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:220)
        at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:279)
        at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:311)
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findAdvisorsThatCanApply(AbstractAdvisorAutoProxyCreator.java:119)
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.findEligibleAdvisors(AbstractAdvisorAutoProxyCreator.java:89)
        at org.springframework.aop.framework.autoproxy.AbstractAdvisorAutoProxyCreator.getAdvicesAndAdvisorsForBean(AbstractAdvisorAutoProxyCreator.java:70)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.wrapIfNecessary(AbstractAutoProxyCreator.java:346)
        at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:298)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:422)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1588)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:553)
        ... 57 common frames omitted
spring spring-boot spring-aop
1个回答
0
投票

是的,异常是由于不同类中的注释方法。

保持@Pointcut注释方法和@Around注释方法在同一个类中,其他明智的使用点切割表达式在@Around注释本身就像。

@Around("execution(* com.*.Abc.methodName(..))")
© www.soinside.com 2019 - 2024. All rights reserved.