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