代码之家  ›  专栏  ›  技术社区  ›  sinuhepop

带注释参数的切入点匹配方法

  •  17
  • sinuhepop  · 技术社区  · 15 年前

    • 是公开的
    • 它的类用@Controller注释 (最后没有)
    • 它的一个参数(可以有多个)用@MyParamAnnotation注释。

    我认为前两个条件很容易,但我不知道用Spring来完成第三个条件是否可能。如果不是,也许我可以改成:

    • 它的一个参数是com.me.MyType类型的实例(或实现一些接口)

    编辑

    @Controller
    public class MyClass {
        public void MyMethod (String arg0, @MyParamAnnotation Object arg1, Long arg3) {
            ...
        }
    }
    

    编辑

    @Around("execution(public * * (.., @SessionInject (*), ..))")
    public void methodAround(JoinPoint joinPoint) throws Exception {
        ...
    }
    
    1 回复  |  直到 15 年前
        1
  •  22
  •   paxdiablo    11 年前

    这是一个有趣的问题,所以我创建了一个小示例应用程序来解决这个问题(并在赛努赫的反馈下进行了改进。)

    DemoController 类作为方面的示例:

    @Controller
    public class DemoController {
    
        public void soSomething(String s, @MyParamAnnotation Double d, Integer i) {
        }
    
        public void doSomething(String s, long l, @MyParamAnnotation int i) {
        }
    
        public void doSomething(@MyParamAnnotation String s) {
        }
    
        public void doSomething(long l) {
        }
    }
    

    将在前三个方法上添加连接点的方面,而不是在参数未使用注释的最后一个方法上 @MyParamAnnotation :

    @Aspect
    public class ParameterAspect {
    
        @Pointcut("within(@org.springframework.stereotype.Controller *)")
        public void beanAnnotatedWithAtController() {
        }
    
        @Pointcut("execution(public * *(.., @aspects.MyParamAnnotation (*), ..))")
        public void methodWithAnnotationOnAtLeastOneParameter() {
        }
    
        @Before("beanAnnotatedWithAtController() " 
                + "&& methodWithAnnotationOnAtLeastOneParameter()")
        public void beforeMethod() {    
            System.out.println("At least one of the parameters are " 
                      + "annotated with @MyParamAnnotation");
        }
    }
    

    第一个切入点将在标记为的类内的所有方法上创建一个连接点 @Controller .

    当满足以下条件时,第二个切入点将添加一个连接点:

    • 第一 *
    • * 是所有类中所有方法的通配符。
    • (..,
    • @aspects.MyParamAnnotation (*), 匹配用给定注释注释的参数。
    • ..) 在带注释的参数之后匹配零到多个任何类型的参数。

    最后是 @Before

    切入点同时适用于AspectJ和SpringAOP!