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
}

您可以使用@within切入点指示符

@within -限制匹配到具有类型中声明的方法的执行使用Spring AOP时给出的注释)

例如

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

关于你的第二个问题,文档说明

请注意,不可能返回一个完全不同的

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

相关内容

  • 没有找到相关文章

最新更新