Friday, July 12, 2013

AOP with annotation


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

Для начала напишем элементарную аннотацию (в дальнейшем, если хотите) ее можно расширить
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface Atom {
}
view raw Atom.java hosted with ❤ by GitHub

Затем аннотируем необходимый метод
@Atom
public void index() {
System.out.println("generate index page");
}

Далее напишем аспектноориентированный метод (вот такое словосочетание) который будет отлавливать нашу аннотацию. Тут все просто (после выполнения инструкций) - срабатывает лог. Мы говорим, что делаем это для любого метода (нам не интересно ни что он возвращает, ни как называется, ни какие аргументы имеет), у которого есть наша аннотацию
@Aspect
public class AtomAdvice {
@After("execution(* *.*(..)) && @annotation(atom) ")
public void myBeforeLogger(JoinPoint joinPoint, Atom atom) {
System.out.println("log atom annotation");
}
}
view raw AtomAdvice.java hosted with ❤ by GitHub

Ну и не забываем добавить в конфиг наш аспектноориентированный подход :) А также просканировать пакет, где этот класс содержится (component-scan)
<aop:aspectj-autoproxy/>

No comments: