这个切点在 Spring AOP 中是如何工作的?

How does this point cut work in Spring AOP?

我正在学习 spring AOP,并从 spring-framework-reference 的 AOP 部分的示例之一得到以下切入点表达式:Proceeding with Arguments

@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() {
    }
}

看点class

@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)

两个切入点都存在语法错误。如果你想拦截一​​个方法,你不能只写一个没有 execution() 的方法签名。另外请不要忘记为任何 return 类型指定 return 类型或至少 *

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

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

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

至于第二个切入点,你可以这样修改:

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

您引用的错误消息意味着 AspectJ 解析器认为您指的是命名切入点而不是预期的方法执行。