Для чего это может быть полезно? Если у вас есть сложное приложение и изменение его кода - очень трудоемкий процесс, то для некоторого класса задач можно использовать 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, который в свою очередь может запустить(а может и нет, как вам будет угодно) нужный метод данного бина