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