Энтони Гонсалвес - Изучаем Java EE 7

Тут можно читать онлайн Энтони Гонсалвес - Изучаем Java EE 7 - бесплатно полную версию книги (целиком) без сокращений. Жанр: comp-programming, издательство Питер, год 2014. Здесь Вы можете читать полную версию (весь текст) онлайн без регистрации и SMS на сайте лучшей интернет библиотеки ЛибКинг или прочесть краткое содержание (суть), предисловие и аннотацию. Так же сможете купить и скачать торрент в электронном формате fb2, найти и слушать аудиокнигу на русском языке или узнать сколько частей в серии и всего страниц в публикации. Читателям доступно смотреть обложку, картинки, описание и отзывы (комментарии) о произведении.

Энтони Гонсалвес - Изучаем Java EE 7 краткое содержание

Изучаем Java EE 7 - описание и краткое содержание, автор Энтони Гонсалвес, читайте бесплатно онлайн на сайте электронной библиотеки LibKing.Ru
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java.
Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода.
Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP). В ней вы найдете максимально ценную информацию, изложенную с точки зрения эксперта по технологиям Java для предприятий.
Благодаря этой книге вы:
— познакомитесь с новейшей версией платформы Java EE;
— исследуете и научитесь использовать API EJB и JPA — от компонентов-сущностей, компонентов-сеансов до компонентов, управляемых сообщениями, и многого другого;
— откроете для себя API для разработки на веб-уровне, в частности JSF, Facelet и Expression Language;
— научитесь обращаться с веб-службами SOAP и RESTful, а также с другими службами, доступными в новейшей версии Java EE;
— узнаете, как создавать динамические пользовательские интерфейсы для корпоративных и транзакционных Java-приложений.

Изучаем Java EE 7 - читать онлайн бесплатно полную версию (весь текст целиком)

Изучаем Java EE 7 - читать книгу онлайн бесплатно, автор Энтони Гонсалвес
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

@Transactional

@Interceptors(LoggingInterceptor.class)

public class CustomerService {

··public void createCustomer(Customer customer) {…}

··public Customer findCustomerById(Long id) {…}

}

Если ваш компонент имеет несколько методов и вы хотите применить перехватчик ко всему компоненту за исключением определенного метода, можете использовать аннотацию javax.interceptor.ExcludeClassInterceptors для исключения перехвата вызова. В следующем отрывке кода вызов к updateCustomer() не будет перехвачен, а остальные будут:

@Transactional

@Interceptors(LoggingInterceptor.class)

public class CustomerService {

··public void createCustomer(Customer customer) {…}

··public Customer findCustomerById(Long id) {…}

··@ExcludeClassInterceptors

··public Customer updateCustomer(Customer customer) {… }

}

Перехватчик жизненного цикла

В начале этой главы я рассказывал о жизненном цикле управляемого компонента (см. рис. 2.2) и событиях обратного вызова. С помощью аннотации обратного вызова вы можете дать контейнеру команду вызвать метод в определенной фазе жизненного цикла (@PostConstruct и @PreDestroy). Например, если вы хотите вносить в журнал запись каждый раз, когда создается экземпляр компонента, вам просто нужно присоединить аннотацию @PostConstruct к методу вашего компонента и добавить к ней некоторые механизмы записи в журнал. Но что, если вам нужно перехватывать события жизненного цикла многих типов компонентов? Перехватчики жизненного цикла позволяют изолировать определенный код в отдельный класс и вызывать его, когда приводится в действие событие жизненного цикла.

Листинг 2.26 демонстрирует класс ProfileInterceptor с двумя методами: logMethod(), который используется для постконструкции, и profile(), применяемый для перехвата методов (@AroundInvoke).

Листинг 2.26. Перехватчик сжизненным циклом и Around-Invoke

public class ProfileInterceptor {

··@Inject

··private Logger logger;

··@PostConstruct

··public void logMethod(InvocationContext ic) throws Exception {

····logger.fine(ic.getTarget(). toString());

····try {

······ic.proceed();

····} finally {

······logger.fine(ic.getTarget(). toString());

····}

··}

··@AroundInvoke

··public Object profile(InvocationContext ic) throws Exception {

····long initTime = System.currentTimeMillis();

····try {

······return ic.proceed();

····} finally {

······long diffTime = System.currentTimeMillis() — initTime;

······logger.fine(ic.getMethod() + " took " + diffTime + " millis");

····}

··}

}

Как видно из листинга 2.26, перехватчики жизненного цикла берут параметр InvocationContext и вместо Object возвращают void. Чтобы применить перехватчик, определенный в листинге 2.26, компонент CustomerService (листинг 2.27) должен использовать аннотацию @Interceptors и определять ProfileInterceptor. Если компонент инстанцируется контейнером, метод logMethod() будет вызван раньше метода init(). Затем, если клиент вызывает createCustomer() или findCustomerById(), будет вызван метод profile().

Листинг 2.27. CustomerService, использующий перехватчик ианнотацию обратного вызова

@Transactional

@Interceptors(ProfileInterceptor.class)

public class CustomerService {

··@Inject

··private EntityManager em;

··@PostConstruct

··public void init() {

····//…

··}

··public void createCustomer(Customer customer) {

····em.persist(customer);

··}

··public Customer findCustomerById(Long id) {

····return em.find(Customer.class, id);

··}

}

Связывание и исключение перехватчиков

Вы уже видели, как перехватываются вызовы в пределах одного компонента (с аннотацией @Around Invoke), а также среди множественных компонентов (с использованием аннотации @Interceptors). Спецификация Interceptors 1.2 также позволяет связать в цепочку несколько перехватчиков.

В действительности аннотация @Interceptors способна прикреплять более одного перехватчика, так как в качестве параметра она берет список перехватчиков, разделенных запятой. Когда определяются множественные перехватчики, порядок их вызова задается тем порядком, в котором они указаны в аннотации @Interceptors. Например, код в листинге 2.28 использует аннотацию @Interceptors у компонента и на уровне методов.

Листинг 2.28. CustomerService, соединяющий несколько перехватчиков

@Stateless

@Interceptors({I1.class, I2.class})

public class CustomerService {

··public void createCustomer(Customer customer) {…}

··@Interceptors({I3.class, I4.class})

··public Customer findCustomerById(Long id) {…}

··public void removeCustomer(Customer customer) {…}

··@ExcludeClassInterceptors

··public Customer updateCustomer(Customer customer) {…}

}

Когда клиент вызывает метод updateCustomer(), перехватчик не вызывается, так как метод аннотирован @ExcludeClassInterceptors. При вызове метода createCustomer() выполняется перехватчик I1, за которым следует перехватчик I2. При вызове метода findCustomerById() перехватчики I1, I2, I3 и I4 выполняются в соответствующем порядке.

Связывание с перехватчиком

Перехватчики определяются в своей собственной спецификации (запрос JSR 318) и могут использоваться в любых управляемых компонентах (EJB, сервлетах, веб-службах RESTful и т. д.). Но CDI расширил исходную спецификацию, добавив к ней связывание с перехватчиком. Это означает, что связывание с перехватчиком может применяться только тогда, когда активизирован CDI.

Если вы посмотрите на листинг 2.25, то увидите, как работают перехватчики. Реализацию перехватчика необходимо указывать непосредственно на реализации компонента (например, @Interceptors(LoggingInterceptror.class)). Это типобезопасно, но нет слабой связи. CDI обеспечивает связывание с перехватчиком, которое представляет определенный уровень косвенности и слабой связанности. Тип связывания с перехватчиком — это определенная пользователем аннотация, также сопровождаемая аннотацией @InterceptorBinding, которая связывает класс перехватчика с компонентом без прямой зависимости между этими двумя классами.

Листинг 2.29 показывает связывание с перехватчиком под названием Loggable. Как видите, данный код очень похож на квалификатор. Связывание с перехватчиком — это аннотация, также аннотированная @InterceptorBinding, которая может быть пустой или иметь члены (например, как в листинге 2.13).

Листинг 2.29. Связывание сперехватчиком Loggable

@InterceptorBinding

@Target({METHOD, TYPE})

@Retention(RUNTIME)

public @interface Loggable { }

При наличии связывания с перехватчиком необходимо прикрепить его к самому перехватчику. Для этого к перехватчику добавляется аннотация @Interceptor и связывание с перехватчиком (Loggable в листинге 2.30).

Листинг 2.30. Перехватчик Loggable

@Interceptor

@Loggable

public class LoggingInterceptor {

··@Inject

··private Logger logger;

··@AroundInvoke

··public Object logMethod(InvocationContext ic) throws Exception {

····logger.entering(ic.getTarget(). toString(), ic.getMethod(). getName());

····try {

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать


Энтони Гонсалвес читать все книги автора по порядку

Энтони Гонсалвес - все книги автора в одном месте читать по порядку полные версии на сайте онлайн библиотеки LibKing.




Изучаем Java EE 7 отзывы


Отзывы читателей о книге Изучаем Java EE 7, автор: Энтони Гонсалвес. Читайте комментарии и мнения людей о произведении.


Понравилась книга? Поделитесь впечатлениями - оставьте Ваш отзыв или расскажите друзьям

Напишите свой комментарий
x