我正在写一个简单的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实现中看到这种行为。