среда, 24 июня 2009 г.

Java Interceptors

Вместе с появлением EJB3.0 в JavaEE появилась очень полезная штука - Interceptors - специальные классы, которые могут перехватывать вызов методов заданного класса.
Для чего это может быть полезно? Если у вас есть сложное приложение и изменение его кода - очень трудоемкий процесс, то для некоторого класса задач можно использовать Interceptor`ы

Например:
  • для изменения некоторых бизнес методов на лету (в т.ч. входных параметров, исключений)
  • для мониторинга производительности приложения
  • для аудита различных событий

Пример:



public class AuditInterceptor {

@AroundInvoke
public Object trace(InvocationContext invocationContext) throws Exception{
System.out.println("Object: " + invocationContext.getTarget().getClass().getName());
System.out.println("Method: " + invocationContext.getMethod());

System.out.println("Parameters:");
for (Object p : invocationContext.getParameters()) {
System.out.println("[" + p.getClass().getName() + "] " + p);
}

return invocationContext.proceed();
}
}


Этот класс может перехватывать события для следуюющего бина:


@Stateless
@Interceptors({AuditInterceptor.class})
public class ComplexBean implements ComplexRemote {

public String makeMeHappy(String param1) {
//some code
}
}


Т.е. при каждом вызове любого метода для этого бина выплонится метод AuditInterceptor.trace, который в свою очередь может запустить(а может и нет, как вам будет угодно) нужный метод данного бина


Комментариев нет:

Отправить комментарий