这个切点在 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 解析器认为您指的是命名切入点而不是预期的方法执行。
我正在学习 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 解析器认为您指的是命名切入点而不是预期的方法执行。