2015-05-28 2 views
0

Я пишу один простой afterReturning аннотация point-cut. Но я хотел бы выполнить aop тогда и только тогда, когда аргументы метода пройти определенные критерииSpring AOP Point cut validate Аннотация Подарок

@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

Вы можете использовать @withinpointcut designator

@within - пределы соответствие для точек соединения в пределах типов, которые имеют данную аннотацию (выполнение методов, объявленное в типах с данной аннотации при использовании пружинного АОП)

Например,

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

Что касается второго вопроса, того documentation состояния

Пожалуйста, обратите внимание, что это не возможно, чтобы вернуться совершенно другой ссылки при использовании после возвращения советов.

Таким образом, хотя код позволяет объявить метод как имеющие тип возвращаемого значения, кроме void, реализация AfterReturning игнорирует. Вы можете увидеть это поведение в реализации АОП Spring AspectJAfterReturningAdvice#afterReturning(...).

+0

спасибо за документацию. Как работает 'inside', если возвращаемым значением является' List 'type? – Reddy

+0

@Reddy Возвращаемое значение (или его тип) не имеет значения. '@ in' относится к типу, указанному в рекомендуемом способе. Это то, что вы спрашиваете? –

+0

, если вы посмотрите мое обновленное сообщение, в настоящее время мой код проверки выглядит примерно так, что не так хорошо. и я думаю, что «в пределах» цели отличается от того, что я смотрю на – Reddy