Энтони Гонсалвес - Изучаем Java EE 7
- Название:Изучаем Java EE 7
- Автор:
- Жанр:
- Издательство:Питер
- Год:2014
- Город:СПб.
- ISBN:978-5-496-00942-3
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Энтони Гонсалвес - Изучаем Java EE 7 краткое содержание
Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
·············xsi: schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
··································http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
·············version="1.1" bean-discovery-mode="all">
··
····org.agoncal.book.javaee7.chapter02.FromEightToThirteenDigitsDecorator
··
Если в приложении присутствуют и перехватчики, и декораторы, то перехватчики вызываются в первую очередь.
События
Внедрение зависимостей, перехватчики и декораторы гарантируют слабую связанность, обеспечивая разнообразные варианты дополнительного поведения как во время развертывания, так и во время выполнения. События, кроме того, позволяют компонентам взаимодействовать вне зависимости от времени компиляции. Один компонент может определить событие, другой — инициировать событие, а третий — обработать его. Эта базовая схема следует шаблону проектирования «Наблюдатель» (Observer), разработанному группой Gang of Four.
Производители событий запускают события, используя интерфейс javax.enterprise.event. Производитель инициирует события вызовом метода fire(), передает объект события и не зависит от наблюдателя. В листинге 2.36 BookService запускает событие (bookAddedEvent) каждый раз при создании книги. Код bookAddedEvent.fire(book) инициирует событие и оповещает любые методы наблюдателя, следящие за этим конкретным событием. Содержание этого события — сам объект Book, который будет передан от производителя потребителю.
public class BookService {
··@Inject
··private NumberGenerator numberGenerator;
··@Inject
··private Event bookAddedEvent;
··public Book createBook(String title, Float price, String description) {
····Book book = new Book(title, price, description);
····book.setIsbn(numberGenerator.generateNumber());
····bookAddedEvent.fire(book);
····return book;
··}
}
События инициируются производителем событий и на них подписываются наблюдатели. Наблюдатель — это компонент с одним или несколькими «отслеживающими» методами. Каждый из этих методов наблюдателя берет в качестве параметра событие определенного типа, сопровождаемое аннотацией @Observers и опциональными квалификаторами. Метод наблюдателя оповещается о событии, если объект события соответствует типу и всем квалификаторам. В листинге 2.37 показана служба инвентаризации, задача которой — отслеживать новые книжные поступления, дополняя информацию о книжном фонде. Там используется метод addBook, который наблюдает за каждым событием с типом Book. Аннотированный параметр называется параметром события. Поэтому, как только событие инициируется компонентом BookService, контейнер CDI приостанавливает выполнение и передает событие любому зарегистрированному наблюдателю. В нашем случае в листинге 2.37 будет вызван метод addBook, который обновит список книг, а затем контейнер продолжит выполнение кода с того места, где он остановился в компоненте BookService. Это означает, что события в CDI не рассматриваются асинхронно.
public class InventoryService {
··@Inject
··private Logger logger;
··List inventory = new ArrayList<>();
··public void addBook(@Observes Book book) {
····logger.info("Adding book " + book.getTitle() + "to inventory");
····inventory.add(book);
··}
}
Как и большинство CDI, производство события и подписка являются типобезопасными и позволяют квалификаторам определять, какие наблюдатели событий будут использоваться. Событию может быть назначен один или несколько квалификаторов (с членами либо без таковых), которые позволяют наблюдателям отличить его от остальных событий такого же типа. Листинг 2.38 возвращается к компоненту BookService, добавив туда дополнительное событие. При создании книги инициируется событие bookAddedEvent, а при удалении — событие bookRemovedEvent, оба с типом Book. Чтобы можно было отличать эти события, каждое из них сопровождается аннотацией @Added или @Removed. Код этих квалификаторов идентичен коду в листинге 2.7: аннотация без членов и аннотированная @Qualifier.
public class BookService {
··@Inject
··private NumberGenerator numberGenerator;
··@Inject @Added
··private Event bookAddedEvent;
··@Inject @Removed
··private Event bookRemovedEvent;
··public Book createBook(String title, Float price, String description) {
····Book book = new Book(title, price, description);
····book.setIsbn(numberGenerator.generateNumber());
····bookAddedEvent.fire(book);
····return book;
··}
··public void deleteBook(Book book) {
····bookRemovedEvent.fire(book);
··}
}
InventoryService в листинге 2.39 наблюдает за обоими событиями, объявив два отдельных метода, один из которых наблюдает за событием о добавлении книги (@Observes @Added Book), а другой — за событием о ее удалении (@Observes @Removed Book).
public class InventoryService {
··@Inject
··private Logger logger;
··List inventory = new ArrayList<>();
··public void addBook(@Observes @Added Book book) {
····logger.warning("Книга " + book.getTitle() + " добавлена в список");
····inventory.add(book);
··}
··public void removeBook(@Observes @Removed Book book) {
····logger.warning("Книга " + book.getTitle() + " удалена из списка");
····inventory.remove(book);
··}
}
Поскольку модель события использует квалификаторы, вам было бы целесообразно задавать поля квалификаторов или агрегировать их. Следующий код наблюдает за всеми добавленными книгами, цена которых превышает 100:
void addBook(@Observes @Added @Price(greaterThan=100) Book book)
Все вместе
А теперь совместим некоторые из этих понятий, напишем несколько компонентов, производителей, используем внедрение, квалификаторы, альтернативы и связывание с перехватчиком. В этом примере применяется контейнер Weld для запуска класса Main в Java SE, а также интеграционный тест для проверки правильности внедрения.
Рисунок 2.7 показывает схему со всеми классами, необходимыми для запуска этого образца кода, и описывает все точки внедрения.

Рис. 2.7.Все вместе
• Компонент BookService имеет метод для создания Java-объектов Book.
• Интерфейс NumberGenerator имеет две реализации для генерации номеров ISBN и ISSN (IsbnGenerator и IssnGenerator) и одну альтернативную реализацию, чтобы генерировать имитационные номера для интеграционных тестов (MockGenerator).
• Реализации NumberGenerator используют два квалификатора, чтобы избежать неоднозначного внедрения зависимости: @ThirteenDigits и @EightDigits.
• LoggingProducer делает возможным внедрение Logger благодаря методу-производителю. LoggingInterceptor в паре с перехватчиком Loggable позволяет компонентам CDI сохранять в журнал записи о методах.
Читать дальшеИнтервал:
Закладка: