我目前正在试验Spring及其AOP功能。
我想知道的是,是否有可能以某种方式扩展切入点定义的表达式语言...
我对Spring提供的切入点指示符的标准行为和用法非常熟悉,但根据我的需要,我想实现自己的行为。
假设我们在方面有一个方法:
@Aspect
public class AspectClass {
@Before("execution(* *.get*(..)) && @annotation(someAnnotation)"
public void doStuff(ProceedingJoinPoint pjp, SomeAnnotation someAnnotation) {
System.out.println("Doing stuff!");
}
}
现在我想要的是这样的:
...
@Before("execution(* *.get*(..)) && @myAnnotation(someAnnotation)"
public void doStuff(ProceedingJoinPoint pjp, SomeAnnotation someAnnotation){
...
myAnnotation(..)
令牌是表达式语言的自定义扩展名。
当我深入研究Spring实现时,我发现解析器所在的位置以及它被硬编码到AspectJExpressionPointcut
实现中的事实。因此,提供所述解析器的自定义实现并将其粘贴到某些bean初始化例程中的某个位置似乎是禁止的。
该扩展的示例性使用将是例如通过其注释匹配方法,忽略该注释在对象分层结构中的接近度。因此它将匹配一个被覆盖的方法,并且其注释是在父实现上定义的。
public abstract class Superclass {
@SomeAnnotation
public abstract String getValue();
}
public class TheClass extends Superclass {
@Override
public String getValue() { // <- this would get advised by Spring using formerly defined aspect
// return some stuff
}
}
我知道我可以在建议中反映方法并检查注释是否存在于某个超类的某个方法上,但是我想封装这个过程并提供它以方便使用。
你们偶然发现了类似这样的事情吗?你能给我一个解决方案(如果可能的话)/解释(如果不是)? : - )
提前致谢,Janek。