为什么@Pointcut名称方法不能被重载?

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

对于Spring Framework 6.0.11关于AOP,有

public class CienciaPointcut {

    @Pointcut("execution(* com.manuel.jordan.service.CienciaService.find*(..))")
    public void cienciaServiceFinds() {

    }

    @Pointcut("execution(* com.manuel.jordan.service.CienciaService.find*(..)) " +
              "&& target(cienciaService) && this(proxy)")
    public void cienciaServiceFinds(CienciaService cienciaService, Object proxy) {

    }

}

观察

cienciaServiceFinds
方法被重载,后者用作:

@AfterThrowing(pointcut="com.manuel.jordan.aop.pointcut.CienciaPointcut.cienciaServiceFinds(cienciaService, proxy)", 
               throwing="exception")

当执行应用程序/测试时,它在启动时失败:

Caused by: java.lang.IllegalStateException: Required parameter names not available when parsing pointcut cienciaServiceFinds in type com.manuel.jordan.aop.pointcut.CienciaPointcut
    at org.aspectj.weaver.reflect.Java15ReflectionBasedReferenceTypeDelegate.getDeclaredPointcuts(Java15ReflectionBasedReferenceTypeDelegate.java:299)
    at org.aspectj.weaver.ReferenceType.getDeclaredPointcuts(ReferenceType.java:890)
    at org.aspectj.weaver.ResolvedType$PointcutGetter.get(ResolvedType.java:261)
    at org.aspectj.weaver.ResolvedType$PointcutGetter.get(ResolvedType.java:258)
    at org.aspectj.weaver.Iterators$4$1.hasNext(Iterators.java:213)
    at org.aspectj.weaver.Iterators$4.hasNext(Iterators.java:230)
    at org.aspectj.weaver.ResolvedType.findPointcut(ResolvedType.java:767)
    at org.aspectj.weaver.patterns.ReferencePointcut.resolveBindings(ReferencePointcut.java:148)
    at org.aspectj.weaver.patterns.Pointcut.resolve(Pointcut.java:189)
    at org.aspectj.weaver.tools.PointcutParser.resolvePointcutExpression(PointcutParser.java:331)
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:312)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.buildPointcutExpression(AspectJExpressionPointcut.java:222)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.obtainPointcutExpression(AspectJExpressionPointcut.java:193)
    at org.springframework.aop.aspectj.AspectJExpressionPointcut.getClassFilter(AspectJExpressionPointcut.java:172)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:226)
    at org.springframework.aop.support.AopUtils.canApply(AopUtils.java:288)
    at org.springframework.aop.support.AopUtils.findAdvisorsThatCanApply(AopUtils.java:320)

但是什么时候使用

public class CienciaPointcut {

    @Pointcut("execution(* com.manuel.jordan.service.CienciaService.find*(..))")
    public void cienciaServiceFinds() {

    }

    @Pointcut("execution(* com.manuel.jordan.service.CienciaService.find*(..)) " +
              "&& target(cienciaService) && this(proxy)")
    public void cienciaServiceFinds2P(CienciaService cienciaService, Object proxy) {

    }

}

观察现在使用的是

cienciaServiceFinds
cienciaServiceFinds2P
。当然,用作:

@AfterThrowing(pointcut="com.manuel.jordan.aop.pointcut.CienciaPointcut.cienciaServiceFinds2P(cienciaService, proxy)", 
               throwing="exception")

当应用程序/测试执行时,它工作正常。

问题

  • 为什么
    @Pointcut
    命名方法不能被重载?
spring aop aspectj spring-aop
1个回答
0
投票

修改切入点声明顺序后,以下工作有效。

public class CienciaPointcut {

    @Pointcut("execution(* com.manuel.jordan.service.CienciaService.find*(..)) " +
              "&& target(cienciaService) && this(proxy)")
    public void cienciaServiceFinds(CienciaService cienciaService, Object proxy) {

    }

    @Pointcut("execution(* com.manuel.jordan.service.CienciaService.find*(..))")
    public void cienciaServiceFinds() {

    }

}

不是答案,但我的假设是,当 AspectJ 遇到

Advice
进行处理时,第一个匹配的切入点名称不满足参数期望。

这里需要注意的一点是,这不是关于方法重载,而是关于切入点处理的顺序。

尝试使用 Spring-boot-version :2.6.4

© www.soinside.com 2019 - 2024. All rights reserved.