Spring AOP Point cut验证Annotation Present

时间:2015-05-28 03:03:39

标签: java spring aop

我正在编写一个简单的afterReturning注释point-cut。但是,当且仅当方法参数通过某些标准时,我才会执行aop

@AfterReturning(value = "execution(* com.test.create(*))", returning = "entity")
public void createAdvice(final AbstractEntity entity) {
    if (entity.getClass().isAnnotationPresent(MyAnnotation.class)) {
        //do something
    }
}

@AfterReturning(value = "execution(* com.test.create(*))", returning = "entityList")
public void createListAdvice(final List<AbstractEntity> entityList) {
    BaseEntity entity = entityList.get(0);
    if (entity.getClass().isAnnotationPresent(MyAnnotation.class)) {
        //do something
    }
}


@MyAnnoation
public class Entity{
     String a;
     String b;
}

但重点是我的实体类中只有少数会有自定义注释MyAnnotation。 我想将此控制逻辑拉到point-cut而不是验证内部方法。

我知道如何进行验证?

另一个问题是,AfterReturning aop方法可以返回值。该方法返回的值会发生什么变化?

@AfterReturning(value = "execution(* com.test.create(*))", returning = "entity")
public Object createAdvice(final AbstractEntity entity) {
    if (entity.getClass().isAnnotationPresent(MyAnnotation.class)) {
        //do something
    }
    return something; //what will happen to this object. how it will be handled
}

1 个答案:

答案 0 :(得分:2)

您可以使用@within this answer

  

@within - 限制匹配以加入具有该类型的类型中的点   给定注释(执行在类型中声明的方法   使用Spring AOP时给出注释)

例如

@AfterReturning(value = "execution(* com.test.create(*)) && @within(com.example.MyAnnotation)", returning = "entity") 

关于你的第二个问题,pointcut designator

  

请注意,不可能完全不同   使用返回后的建议时参考。

因此,虽然代码允许您将方法声明为具有void以外的返回类型,但AfterReturning的实现会忽略它。你可以在Spring的AspectJAfterReturningAdvice#afterReturning(...)的AOP实现中看到这种行为。