•
•
•
Начиная с Java EE 6, перехватчики оформились в отдельную спецификацию (до этого они входили в состав спецификации EJB). Они могут применяться к управляемым компонентам, как вы увидите далее в этом разделе, а также к компонентам EJB и веб-службам SOAP и RESTful.
Перехватчики целевого класса
Существует несколько способов определения перехвата. Самый простой — добавить перехватчики (уровня метода, тайм-аута или жизненного цикла) к самому компоненту, как показано в листинге 2.23. Класс CustomerService сопровождает logMethod() аннотацией @AroundInvoke. Этот метод используется для регистрации сообщения во время входа в метод и выхода из него. Как только этот управляемый компонент развертывается, любой клиентский вызов createCustomer() или findCustomerById() будет перехватываться и начнет применяться logMethod(). Обратите внимание, что область видимости этого перехватчика ограничена самим компонентом (целевым классом).
@Transactional
public class CustomerService {
··@Inject
··private EntityManager em;
··@Inject
··private Logger logger;
··public void createCustomer(Customer customer) {
····em.persist(customer);
··}
··public Customer findCustomerById(Long id) {
····return em.find(Customer.class, id);
··}
··@AroundInvoke
··private Object logMethod(InvocationContext ic) throws Exception {
····logger.entering(ic.getTarget(). toString(), ic.getMethod(). getName());
····try {
······return ic.proceed();
····} finally {
······logger.exiting(ic.getTarget(). toString(), ic.getMethod(). getName());
····}
··}
}
Несмотря на аннотацию @AroundInvoke, logMethod() должен иметь следующий образец подписи:
@AroundInvoke
Object
Следующие правила относятся к методу, предшествующему вызову (а также конструктору, времени задержки или перехватчикам жизненного цикла):
• метод может иметь доступ public, private, protected либо доступ на уровне пакета, но не должно быть доступа static или final;
• метод должен иметь параметр javax.interceptor.InvocationContext и возвращать объект, который является результатом вызванного метода проб;
• метод может генерировать проверяемое исключение.
Объект InvocationContext позволяет перехватчикам контролировать поведение цепочки вызовов. Если несколько перехватчиков соединены в цепочку, то один и тот же экземпляр InvocationContext передается каждому перехватчику, который может добавить контекстуальные данные для обработки другими перехватчиками. Таблица 2.4 описывает API InvocationContext.