Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/343.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 扩展Spring的切入点定义表达式语言_Java_Spring_Aop_Aspectj - Fatal编程技术网

Java 扩展Spring的切入点定义表达式语言

Java 扩展Spring的切入点定义表达式语言,java,spring,aop,aspectj,Java,Spring,Aop,Aspectj,我目前正在试验Spring及其AOP特性 我想知道的是,是否有可能以某种方式扩展切入点定义的表达式语言 我非常熟悉Spring提供的切入点指示器的标准行为和用法,但出于我的需要,我想实现我自己的切入点指示器 假设我们在这方面有一个方法: @Aspect public class AspectClass { @Before("execution(* *.get*(..)) && @annotation(someAnnotation)" public void d

我目前正在试验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。。token是表达式语言的自定义扩展

当我深入研究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。

我怀疑这是否可行。正如您所提到的,这个特定的构造是核心AspectJ语言的一部分,并且不像您所提到的那样具有可扩展性。