1

我目前正在试验 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
    }
}

我知道我可以在通知中反映方法并检查注释是否存在于某个超类的某些方法上,但我想封装这个过程并提供它以方便使用。


你们有没有偶然发现这样的事情&你能给我一个解决方案(如果可能的话)/解释(如果不是的话)吗?:-)

在此先感谢,珍妮克。

4

0 回答 0