Delivering Excellence in Software Engineering ® EPAM Systems. All rights reserved. Contexts and Dependency Injection in Java EE 6 Елена Сирота Руководитель Java лаборатории (RD Unit)
® EPAM Systems. All rights reserved. Тема Архитектура распределенных систем –Серверные объекты –Контейнеры серверных объектов –Сервисы для серверных объектов Java EE platform –Чего не хватает в Java EE 5 Inversion of Control (Ioc) –В чем состоит инверсия контроля –Почему появился IoC-контейнер –Dependency Injection IoC в Java EE –Java EE CDI – IoC container –Примеры CDI plus EJB 2
® EPAM Systems. All rights reserved. Серверные объекты Распределенные корпоративные приложения: –Архитектура клиента должна быть простой –Все механизмы по обеспечению работы под нагрузкой находятся на серверной стороне Наиболее выдающаяся архитектура распределенных корпоративных систем - CORBA –В CORBA объект – это сущность вместе с объектной ссылкой, по которой можно вызвать операции, определенные в интерфейсе объекта –В CORBA реализации объекта находятся на серверной стороне, а клиент получает удаленную ссылку на эти объекты 3
® EPAM Systems. All rights reserved. Жизненный цикл серверных объектов –Жизненным циклом серверных объектов управляет контейнер 4
® EPAM Systems. All rights reserved. Серверные объекты Java EE 5 Java EE Server Objects –Servlet, JSF backing bean –EJB Java EE Containers –Web-container (Servlet, JSF backing bean) –EJB-container (EJB components) Как создать серверные объекты? new Servlet() new EjbComponent() Контейнер, pls, создай объект 5
® EPAM Systems. All rights reserved. Как Java EE выдерживает высокую нагрузку –Сервлеты Singleton –EJB Stateless Session Beans Pooling –EJB Stateful Session Beans Passivate, activate 6
® EPAM Systems. All rights reserved. Сервисы для серверных объектов Важной частью спецификации CORBA являются –Сервисы для распределенных объектов Сервисы для распределенных объектов: –naming service –lifecycle management –security –transactions –event notification –concurrency control –… 7
® EPAM Systems. All rights reserved. Java EE 5 Platform Контейнеры Сервисы Коммуникации –RMI-IIOP –HTTP –WS –Messaging «Сквозные сервисы» –Distributed transactions –Security 8
® EPAM Systems. All rights reserved. Java EE 5 Platform Sun Java System Application Server 9.1 9
® EPAM Systems. All rights reserved. Java EE tiers Transactional tier Web tier 10
® EPAM Systems. All rights reserved. Вывод Все названное нужно и важно. Но… 11
® EPAM Systems. All rights reserved. Предопределенный набор типов серверных объектов Java EE 5: четко задан тип объектов, управляемых контейнером. Среди них нет POJO Managed objects: Servlet JSF backing beans Managed objects: Servlet JSF backing beans Managed object: EJB components 12
® EPAM Systems. All rights reserved. Почему удобно, когда контейнер управляет объектами? Так как контейнер может применить механизмы для работы под высокой нагрузкой (это реализуется в EJB контейнерах) –Pooling –Activate/passivate А еще? Можно «поймать» вызов метода –Обрамление вызова транзакцией –Проверка security –Логгирование –И т.д. Можно управлять областью существования объекта –Автоматическое управление областью существования объекта в нужном контексте (session, request, …) 13
® EPAM Systems. All rights reserved. What is missing in Java EE 5? В Java EE не хватает контейнера для custom server objects (POJO) –Inversion of Control (IoC) container Но при этом все остальные возможности и преимущества Java EE нужны (существующие контейнеры и сервисы) 14
® EPAM Systems. All rights reserved. Inversion of control Инверсия контроля –При использовании контейнеров поток выполнения программы уже инвертирован, так как контейнер управляет жизненным циклом объекта Но объекты могут зависеть от контейнера: –Реализуют специфические для контейнера интерфейсы –Используют специфический для контейнера API для lookup зависимых объектов IoC помогает убрать зависимость объекта от контейнера –Не нужно реализовать специфические интерфейсы –Не нужно вызывать специфический API для lookup зависимых объектов. Для этого используется dependency injection. dependency injection убирает зависимости объекта от контейнера. Зависимости «собирает» контейнер. В этом и состоит inversion of control 15
® EPAM Systems. All rights reserved. Dependency Injection Когда контейнер инстанцирует компонент, он «собирает» все его зависимости Dependency injection позволяет отделить код для «сборки» компонента от логики компонента 16
® EPAM Systems. All rights reserved. То же самое другими словами Для корпоративных приложений нужны соответствующие архитектуры –Компонентная архитектура для серверных объектов 17
® EPAM Systems. All rights reserved. Component Architecture Microsoft Application Architecture Guide v2. p. 24: Components depend upon a mechanism within the platform that provides an environment in which they can execute, often referred to as component architecture. Examples are the component object model (COM) and the distributed component object model (DCOM) in Windows; and Common Object Request Broker Architecture (CORBA) and Enterprise JavaBeans (EJB) on other platforms. Component architectures manage the mechanics of locating components and their interfaces, passing messages or commands between components, andin some casesmaintaining state. 18
® EPAM Systems. All rights reserved. Инвазивные компонентные модели Традиционные компонентные фреймворки: –Базируются на инвазивных компонентных моделях –Предоставляют API для dependency lookup Инвазивные –Разработчик должен реализовать специфические интерфейсы Dependency Lookup –Разработчик должен вызвать специфический API для поиска в глобальном реестре Это приводит к –Непортабельная компонентная модель –Компоненты могут быть протестированы только в контейнере. Могут быть сложности с «поднятием» контейнера отдельно от платформы (например, EJB container). Примеры: EJB, CCM (CORBA Component Model) 19
® EPAM Systems. All rights reserved. Неинвазивные компонентные модели IoC фреймворки –Неинвазивные –Используют dependency injection/setting. Инвазивные –Не нужно реализовывать специфические интерфейсы Dependency injection/setting –Это «инверсивная» версия для lookup Это позволяет убрать зависимость компонента от контейнера Примеры: Spring, PicoContainer, Google Guice, Tapestry IoC, … 20
® EPAM Systems. All rights reserved. Задачи IoC контейнера Управление жизненным циклом компонентов Управление областью существования компонента «Перехват» входа в метод Конфигурация компонента –xml –annotations Сборка зависимостей компонента 21
® EPAM Systems. All rights reserved. Dependency Injection in Java EE 5 Ограниченный набор ресурсов, которые могут быть «инджектированы» веб-контейнером или ejb-контейнером @PersistenceUnit (Java EE ресурсы, например DataSource, JMS destination; UserTransaction) 22
® EPAM Systems. All rights reserved. CDI CDI (Contexts and Dependency Injection) for Java EE Platform, JSR 299 –IoC Container in Java EE 6 CDI предоставляет следующие сервисы для бинов –Управление жизненным циклом –Dependency injections –Event notification –Interceptions (business method interception, lifecycle callback interception) –Contexts (области существования объекта) –EL integration (bean names) 23
® EPAM Systems. All rights reserved. Goal of CDI Упростить создание приложений, которые используют технологии веб-уровня и бизнес-уровня Transactional tier Web tier 24
® EPAM Systems. All rights reserved. Унификация – термин «Managed Bean» В Java EE 6 введен термин managed bean – любой объект, которым управляет контейнер Managed beans: –EJB session beans –annotated –POJO (Plain Old Java Object) 25
® EPAM Systems. All rights reserved. CDI Bean CDI bean –POJO. Без каких-либо аннотаций и т.д. 26
® EPAM Systems. All rights reserved. CDI BY EXAMPLES Примеры 27
® EPAM Systems. All rights reserved. CDI Bean public class Login implements Serializable { private Credentials credentials; public boolean login() { // login using credentials … } public class Credentials implements Serializable { private String username; private String password; … } 28
® EPAM Systems. All rights reserved. Injection public class Login implements Serializable private Credentials credentials; public boolean login() { // login using credentials … } –Field, initializer method parameter (e.g. setter)
® EPAM Systems. All rights reserved. EL public class Login implements Serializable private Credentials credentials; public boolean login() { // login using credentials … } 30
® EPAM Systems. All rights reserved. JSF Managed Bean public class Login implements Serializable private Credentials credentials; public boolean login() { // login using credentials … } 31
® EPAM Systems. All rights reserved. JSF Username: Password: 32
® EPAM Systems. All rights reserved. Что может быть injected Что может быть «injected» –Beans –EJB session bean –Resources (Java EE Resources, persistence contexts, persistence units, remote EJBs, web services) А еще? –Produced beans 33
® EPAM Systems. All rights reserved. Пример со случайными public class RandomNumberGenerator { private Random Integer getRandomNumber() { return random.nextInt(100); public class UserNumberBean implements Serializable Integer randomInt; … } 34
® EPAM Systems. All rights reserved. public class Login implements Serializable private Credentials credentials; private Client client; public void login() {... } public void logout() public Client getLoggedInClient() { return client; – «квантор» (qualifier), который вводит семантическую однозначность 35
® EPAM Systems. All rights reserved. Client of public class Client client;... } 36 Контейнер подставит не любого клиента (например, new Client()), а только того, который создан тем методом-продюсером, у которого есть
® EPAM Systems. All rights reserved. Event public class Login implements Serializable { private private private Event userLoggedOutEvent; public void login() { client =... if (client!=null) userLoggedInEvent.fire(client); } public void logout() { if (client!=null) { userLoggedOutEvent.fire(client); } client = null; } 37
® EPAM Systems. All rights reserved. Event Notification (2/3) public class DoSomeLogicOnLogin { Client client) {... } Client client) {... } 38
® EPAM Systems. All rights reserved. Event @Target({METHOD, FIELD, PARAMETER, TYPE}) @Target({METHOD, FIELD, PARAMETER, TYPE}) LoggedOut {} qualifier 39
® EPAM Systems. All rights Transactional {} public class ShoppingCart public void checkout() {... public class TransactionInterceptor UserTransaction public Object manageTransaction(InvocationContext ctx) throws Exception {... } } 40
® EPAM Systems. All rights reserved. Области существования серверных объектов Java EE-компоненты (servlets, EJBs) не имеют четко- определенной области существования 41
® EPAM Systems. All rights reserved. Области существования (Contexts) CDI определяет следующие встроенные контексты: Web + Transactional: –Stateful EJBs теперь могут иметь область существования из указанных выше контекстов Servlet scopes JSF scope Bound to lifecycle of bean holding reference 42
® EPAM Systems. All rights reserved. Вопрос к аудитории: –Какие еще контексты вы можете придумать? 43
® EPAM Systems. All rights reserved. CDI PLUS EJB CDI + EJB 44
® EPAM Systems. All rights reserved. EJB Session Beans Когда использовать EJB Session beans? В случае, если необходимы следующие enterprise services: –EJB – это thread-safe компоненты –управление транзакциями для метода –контроль безопасности для метода –pooling (stateless EJBs), passivate/activate (stateful EJBs) –remote invocation –web service invocation –timer EJB –asynchronous EJB –JMX monitoring Если вам не нужны эти возможности, то используйте обыкновенные CDI beans 45
® EPAM Systems. All rights reserved. CDI vs EJB EJB предоставляют удобные enterprise services CDI – это только IoC контейнер –CDI не предоставляет ни управления транзакциями, ни мониторинга, ни потокобезопасности (но это можно «дописать») EJB + CDI = синергия обоих технологий 46
® EPAM Systems. All rights reserved. Синергия двух технологий EJB + CDI = синергия public class ShopCartBuilder {... } 47
® EPAM Systems. All rights reserved. Одновременный доступ к CDI beans В объекты доступны для конкурентного доступа –Для того, чтобы сделать объект thread-safe используйте возможности EJB-контейнера –Сделайте объекты в указанных контекстах public class ShopCartBuilder { … } 48
® EPAM Systems. All rights reserved. Области существования Stateful EJB-компонентов Stateful EJB могут быть привязаны к следующим четко определенным контекстам: –session, request, application, conversation 49
® EPAM Systems. All rights reserved. Реализации CDI Weld –GlassFish 3.0 –Jboss –Tomcat or later –Jetty 6.1.x Apache OpenWebBeans –IBM WebSphere 8 50
® EPAM Systems. All rights reserved. CDI Manual lookup 51
® EPAM Systems. All rights reserved. Когда нужен manual lookup? Ваши варианты? 52
® EPAM Systems. All rights reserved. Шаг 1. Получение Bean Manager Получить BeanManager можно с помощью ServletContext или через JNDI –Via Servlet Context ServletContext c = …; c.getAttribute("javax.enterprise.inject.spi.BeanManager"); –Via JNDI try{ InitialContext iniContext = new InitialContext(); Context c=iniContext.lookup("java:comp/BeanManager"); return (BeanManager) c; catch (NamingException e) { … } 53
® EPAM Systems. All rights reserved. Шаг 2. Запрос компонента у BeanManager 1) Поиск по классу объекта 2) Поиск по имени 54
® EPAM Systems. All rights reserved. Поиск по классу объекта public Object getBeanByClass(Class cl) { BeanManager bm = getBeanManager(); Bean bean = (Bean) bm.getBeans(cl).iterator().next(); CreationalContext c=bm.createCreationalContext(bean); Object obj = bm.getReference(bean, cl, ctx); return obj; } 55
® EPAM Systems. All rights reserved. Поиск по имени объекта public Object getBeanByName(String name) { BeanManager bm = getBeanManager(); Bean bean = bm.getBeans(name).iterator().next(); java.lang.reflect.Type type=bean.getTypes().iterator().next(); CreationalContext c=bm.createCreationalContext(bean); Object o = bm.getReference(bean, type, c); return o; } 56
® EPAM Systems. All rights reserved. Bibliography ORB Basics. Ke Jin. Why and what of Inversion of Control. Martin Fowler. Inversion of Control Containers and the Dependency Injection pattern Dan Allen. Moving to Java EE 6 and CDI and away from the clutter JSR Web Beans 1.0 Final Release Adam Bien. Enterprise JavaBeans 3.1 with Contexts and Dependency Injection: The Perfect Synergy Weld - JSR-299 Reference Implementation. JSR-299: The new Java standard for dependency injection and contextual lifecycle management Java EE 6 Tutorial. The guessnumber CDI Example
Delivering Excellence in Software Engineering ® EPAM Systems. All rights reserved. Contexts and Dependency Injection in Java EE 6 For more information, please contact: Olena Syrota, PhD in information technology Java Lab Lead EPAM Systems, Inc.