切点在Spring AOP中如何工作?

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

我正在学习spring AOP,并从spring-framework-reference的AOP部分中的示例之一获得以下切入点表达式:继续进行参数处理

@Around("execution(List<Account> find*(..)) && " +
        "com.xyz.myapp.SystemArchitecture.inDataAccessLayer() && " +
        "args(accountHolderNamePattern)")
public Object preProcessQueryPattern(ProceedingJoinPoint pjp,
        String accountHolderNamePattern) throws Throwable {
    String newPattern = preProcess(accountHolderNamePattern);
    return pjp.proceed(new Object[] {newPattern});
}

据我所知,此切入点表达式不正确,因为and条件将永远无法满足。我是否缺少一些显而易见的东西?

我也尝试了以下(ref):

@Component
public class TestBean {
    public void testMethod() {
    }
}

方面类

@Before("com.test.bean.TestBean.testMethod()")
    public void testAspect() {
        System.out.println("Worked");
    }

失败的原因

Caused by: java.lang.IllegalArgumentException: error at ::0 can't find referenced pointcut testMethod
    at org.aspectj.weaver.tools.PointcutParser.parsePointcutExpression(PointcutParser.java:319)
spring-aop
1个回答
0
投票
两个切入点都有语法错误。如果要拦截方法,就不能只写一个没有execution()的方法签名。另外,请不要忘记指定返回类型,或者至少为任何返回类型指定*

第一个切入点在语法上是正确的,如下所示:

@Around( "execution(List<Account> find*(..)) && " + "execution(* com.xyz.myapp.SystemArchitecture.inDataAccessLayer()) && " + "args(accountHolderNamePattern)" )

但是仍然不匹配任何方法,因为&&(逻辑AND)要求两个方法的执行同时为真,这是不可能的。 find*(..)inDataAccessLayer()正在执行,永远不要同时执行。您可以改为使用||(逻辑或),但是args()匹配器将是模糊的,因此切入点将再次无效。除非您向我解释您要实现的目标,否则我不会告诉您如何解决切入点。现在的样子没有任何意义。

关于第二个切入点,您可以像这样修复它:

@Before("execution(* com.test.bean.TestBean.testMethod())")

您引用的错误消息表示AspectJ解析器认为您正在引用命名的切入点,而不是预期的方法执行。
© www.soinside.com 2019 - 2024. All rights reserved.