Изучаем Java EE 7 - [25]
— перехватчик, который вмешивается в работу обратных вызовов событий жизненного цикла целевого экземпляра (@PostConstruct и @PreDestroy).
Начиная с 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.
Метод | Описание |
---|---|
getContextData | Позволяет значениям передаваться между методами перехвата в том же экземпляре InvocationContext с использованием Map |
getConstructor | Возвращает конструктор целевого класса, для которого был вызван перехватчик |
getMethod | Возвращает метод класса компонентов, для которого был вызван перехватчик |
getParameters | Возвращает параметры, которые будут использоваться для вызова бизнес-метода |
getTarget | Возвращает экземпляр компонента, к которому относится перехватываемый метод |
getTimer | Возвращает таймер, ассоциированный с методом @Timeout |
proceed | Обеспечивает вызов следующего метода перехватчика по цепочке. Он возвращает результат следующего вызываемого метода. Если метод относится к типу void, то proceed возвращает null |
setParameters | Модифицирует значение параметров, используемых для вызова методов целевого класса. Типы и количество параметров должны совпадать с подписью метода компонента, иначе будет сгенерировано исключение IllegalArgumentException |
Чтобы понять, как работает код в листинге 2.23, взгляните на схему последовательности на рис. 2.6. Вы увидите, что происходит, когда клиент вызывает метод createCustomer(). Прежде всего контейнер перехватывает вызов и вместо прямой обработки createCustomer() сначала вызывает метод logMethod(). Данный метод использует интерфейс InvocationContext для получения имени вызываемого компонента (ic.getTarget()), а вызываемый метод (ic.getMethod()) применяет для регистрации сообщения о входе (logger.entering()). Затем вызывается метод proceed(). Вызов InvocationContext.proceed() очень важен, поскольку сообщает контейнеру, что тот должен обрабатывать следующий перехватчик или вызывать бизнес-метод компонента. При отсутствии вызова proceed() цепочка перехватчиков будет остановлена, а бизнес-метод не будет вызван. В конце вызывается метод createCustomer(), и как только он возвращается, перехватчик прекращает выполнение, регистрируя сообщение о выходе (logger.exiting()). Вызов клиентом метода findCustomerById() происходил бы в той же последовательности.
Рис. 2.6. Вызов перехватываемого бизнес-метода
Листинг 2.23 использует новую аннотацию @javax.transaction.Transactional. Она применяется для управления разграничением операций на компонентах CDI, а также сервлетах и оконечных точках сервисов JAX-RS и JAX-WS. Она обеспечивает семантику атрибутов транзакции EJB в CDI. Аннотация @Transactional реализуется с помощью перехватчика. Подробнее о транзакциях рассказывается в главе 9.
Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.
Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.