Энтони Гонсалвес - Изучаем 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 - читать онлайн бесплатно полную версию (весь текст целиком)
Интервал:
Закладка:
• Класс Main использует BookService, чтобы создать Book и сгенерировать номер с помощью IsbnGenerator. Интеграционный тест BookServiceIT использует альтернативу MockGenerator для генерации имитационного номера книги.
Классы, описанные на рис. 2.7, следуют стандартной структуре каталога Maven:
• src/main/java — каталог для всех компонентов, квалификаторов, перехватчиков и класса Main;
• src/main/resources — пустой файл beans.xml, поэтому мы можем инициировать CDI без альтернатив и перехватчиков;
• src/test/java — каталог для интеграционных тестов BookServiceIT и альтернативы MockGenerator;
• src/test/resources — файл beans.xml, обеспечивающий работу альтернативы MockGenerator и перехватчика LoggingInterceptor;
• pom.xml — модель объекта проекта Maven (POM), описывающая проект и его зависимости.
Написание классов Book и BookService
Приложение CD-Bookstore использует класс BookService для создания книг (листинг 2.40). Java-объект Book (листинг 2.41) имеет название, описание и цену. Номер книги (ISBN или ISSN) генерируется внешним сервисом.
@Loggable
public class BookService {
··@Inject @ThirteenDigits
··private NumberGenerator numberGenerator;
··public Book createBook(String title, Float price, String description) {
····Book book = new Book(title, price, description);
····book.setNumber(numberGenerator.generateNumber());
····return book;
··}
}
BookService располагает одним методом, который берет название, цену и описание и возвращает POJO Book. Чтобы задать ISBN-номер книги, этот класс использует внедрение (@Inject) и квалификаторы (@ThirteenDigits) для вызова метода generateNumber, принадлежащего IsbnGenerator.
public class Book {
··private String title;
··private Float price;
··private String description;
··private String number;
··//Конструкторы, геттеры, сеттеры
}
В листинге 2.40 BookService аннотирован связкой с перехватчиком @Loggable (листинг 2.50). Когда эта связка действует, она регистрирует момент входа в метод и выхода из него.
Написание классов NumberGenerator
Класс BookService в листинге 2.40 зависит от интерфейса NumberGenerator (листинг 2.42). Этот интерфейс обладает методом, который генерирует и возвращает номер книги. Интерфейс реализуется классами IsbnGenerator, IssnGenerator и MockGenerator.
public interface NumberGenerator {
··String generateNumber();
}
Класс IsbnGenerator (листинг 2.43) сопровождается квалификатором @ThirteenDigits. Это сообщает CDI о том, что сгенерированный номер состоит из 13 цифр. Заметьте, что класс IsbnGenerator также использует внедрение для получения java.util.logging.Logger (произведенного в листинге 2.48) и связывание с перехватчиком @Loggable для регистрации момента входа в метод и выхода из него.
@ThirteenDigits
public class IsbnGenerator implements NumberGenerator {
··@Inject
··private Logger logger;
··@Loggable
··public String generateNumber() {
····String isbn = "13-84356-" + Math.abs(new Random(). nextInt());
····logger.info("Сгенерирован ISBN: " + isbn);
····return isbn;
··}
}
Класс IssnGenerator в листинге 2.44 — это восьмизначная реализация NumberGenerator.
@EightDigits
public class IssnGenerator implements NumberGenerator{
··@Inject
··private Logger logger;
··@Loggable
··public String generateNumber() {
····String issn = "8-" + Math.abs(new Random(). nextInt());
····logger.info("Сгенерирован ISBN: " + issn);
····return issn;
··}
}
Класс MockGenerator в листинге 2.45 является альтернативой IsbnGenerator (поскольку также сопровождается квалификатором @ThirteenDigits). MockGenerator используется только для интеграционных тестов, так как его можно активизировать только в файле beans.xml тестовой среды (см. листинг 2.55).
@Alternative
@ThirteenDigits
public class MockGenerator implements NumberGenerator {
··@Inject
··private Logger logger;
··@Loggable
··public String generateNumber() {
····String mock = "MOCK-" + Math.abs(new Random(). nextInt());
····logger.info("Сгенерирован Mock: " + mock);
····return mock;
··}
}
Написание квалификаторов
Поскольку существует несколько реализаций NumberGenerator, CDI необходимо квалифицировать каждый компонент и каждую точку внедрения во избежание неоднозначного внедрения. Для этого он использует два квалификатора: Thirteen Digits (листинг 2.46) и EightDigits (листинг 2.47), оба из которых аннотированы javax.inject.Qualifier и не имеют членов (просто пустые аннотации). Аннотация @ThirteenDigits применяется в компоненте IsbnGenerator (см. листинг 2.43), а также в точке внедрения BookService (см. листинг 2.40).
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface ThirteenDigits { }
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD})
public @interface EightDigits { }
Написание автоматического журнала
Демонстрационное приложение использует запись в журнал несколькими способами. Как вы могли видеть в листингах 2.43–2.45, все реализации NumberGenerator применяют внедрение для получения java.util.logging.Logger и записи в журнал. Поскольку Logger входит в состав JDK, он не является внедряемым по умолчанию (архив rt.jar не содержит файла beans.xml) и вам необходимо произвести его. Класс LoggingProducer в листинге 2.48 имеет метод продюсера (produceLogger), аннотированный @Produces. Этот метод создаст и вернет Logger, сопровождаемый параметрами имени класса точки внедрения.
public class LoggingProducer {
··@Produces
··public Logger produceLogger(InjectionPoint injectionPoint) {
····return Logger.getLogger(injectionPoint.getMember(). getDeclaringClass(). getName());
··}
}
Класс LoggingInterceptor в листинге 2.49 использует произведенный Logger для регистрации входа в методы и выхода из них. Поскольку запись в журнал может рассматриваться как сквозная функциональность, она отдельно реализуется в виде перехватчика (@AroundInvoke на logMethod). Класс LoggingInterceptor определяет связь с перехватчиком @Loggable (листинг 2.50) и может впоследствии применяться в любом компоненте (например, BookService в листинге 2.40).
@Interceptor
@Loggable
public class LoggingInterceptor {
··@Inject
··private Logger logger;
··@AroundInvoke
··public Object logMethod(InvocationContext ic) throws Exception {
····logger.entering(ic.getTarget(). getClass(). getName(),
Интервал:
Закладка: