Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski
ASP.NET (2) Contexts and Dependency Injection (CDI) Specyfikacja składowa Java EE 6 dotycząca współpracy warstwy prezentacji z warstwą usług biznesowych (transakcyjnych) integruje JSF z EJB początkowo rozwijana pod nazwą Web Beans bazuje na specyfikacjach Managed Beans i Dependency Injection for Java zainspirowana frameworkami Seam, Guice i Spring Dwie myśli przewodnie: konteksty wstrzykiwanie zależności Implementacja referencyjna: Weld (JBoss)
Usługi oferowane przez CDI Wiązanie cyklu życia komponentów stanowych z ściśle zdefiniowanymi kontekstami Wstrzykiwanie komponentów do aplikacji z kontrolą zgodności typów Integracja z językiem wyrażeń (EL) umożliwiająca bezpośrednie użycie komponentów na stronach JSF i JSP Możliwość interakcji między obiektami w oparciu o model powiadamiania o zdarzeniach Interceptory i dekoratory ( bardziej świadome interceptory ) Charakterystyka modelu programistycznego CDI: loose coupling with strong typing ASP.NET (3)
ASP.NET (4) Beans w CDI CDI rozszerza koncepcję beans znaną z JavaBeans i EJB Bean = obiekt przywiązany do kontekstu cyklu życia CDI w pełni obsługuje sesyjne EJB i managed beans wstrzykiwanie sesyjnych EJB i managed beans do innych sesyjnych EJB i managed beans CDI umożliwia również wstrzykiwanie do komponentów, które same nie są beans w sensie CDI: komunikatowe EJB interceptory serwlety, filtry serwletów punkty końcowe usług JAX-WS (web services) handlery znaczników JSP
ASP.NET (5) Anatomia beana Niepusty zbiór typów beana (bean types) bean type = klasa/interfejs widziana przez klienta np. lokalny interfejs EJB (zdalny nie może być!) Niepusty zbiór kwalifikatorów (qualifiers) umożliwiają rozróżnienie implementacji typu bez uciekania się do tekstowych nazw domyślnie @Default Zasięg Opcjonalna nazwa EL Zbiór wiązań interceptorów Implementacja beana
ASP.NET (6) Przykłady beanów i ich typów Zwykła klasa Java public class Basket extends Container implements Convertible { Sesyjny EJB @Stateful public class BookShopBean implements BookShop {... Bean types: - BookShop (@Local) - java.lang.object Bean types: - Basket - Container - Convertible - java.lang.object
ASP.NET (7) Wstrzykiwanie beanów public class Greeting { public String greet(string name) { return "Hello, " + name + "."; Wstrzyknięcie beana do innego komponentu import javax.inject.inject; public class Printer { @Inject Greeting greeting;... Wstrzykiwanie w oparciu o typ Bean nie musi mieć nazwy! Bean
ASP.NET (8) Kwalifikatory (ang. qualifiers) Umożliwiają dostarczenie różnych implementacji danego typu beana Definiowane w formie adnotacji Java import static java.lang.annotation.elementtype.field; import static java.lang.annotation.elementtype.method; import static java.lang.annotation.elementtype.parameter; import static java.lang.annotation.elementtype.type; import static java.lang.annotation.retentionpolicy.runtime; import java.lang.annotation.retention; import java.lang.annotation.target; import javax.inject.qualifier; @Qualifier @Retention(RUNTIME) @Target({TYPE, METHOD, FIELD, PARAMETER) public @interface Informal {
ASP.NET (9) Użycie kwalifikatora Klasa beana z kwalifikatorem @Informal public class InformalGreeting extends Greeting { public String greet(string name) { return "Hi, " + name + "!"; Domyślnie @Default Wstrzyknięcie wskazanej implementacji beana import javax.inject.inject; public class Printer { @Inject @Informal Greeting greeting;...
Zasięgi i konteksty Zasięg determinuje cykl życia instancji beana oraz to który klient korzysta z której instancji kiedy tworzona jest nowa instancja beana o danym zasięgu? kiedy istniejąca instancja beana o danym zasięgu jest niszczona? które wstrzyknięte referencje odwołują się do których instancji beana o danym zasięgu? CDI oferuje: 4 wbudowane zasięgi 2 wbudowane pseudo-zasięgi możliwość definiowania własnych zasięgów wymaga zdefiniowania kontekstu implementującego zasięg ASP.NET (10)
javax.enterprise.context ASP.NET (11) Wbudowane zasięgi CDI Zasięgi: @RequestScoped jak w JSF @SessionScoped jak w JSF @ApplicationScoped jak w JSF @ConversationScoped konwersacja o programowo określonym początku i końcu Pseudo-zasięgi: @Singleton jedna współdzielona instancja @Dependent domyślny zasięg, związanie z cyklem życia klienta javax.inject
ASP.NET (12) Zasięg konwersacji Wykorzystywany do realizacji określonego zadania ( unit of work ) Podobny do zasięgu sesji: obejmuje sekwencję odwołań do serwera nie może przekraczać granic sesji HTTP Różnice w stosunku do sesji: początek i koniec konwersacji określony jawnie przez aplikację stan związany z kartą (tab) w przeglądarce Aktywny podczas każdego żądania JSF domyślnie kończy się wraz z żądaniem aby obejmował sekwencję żądań musi być jawnie przekształcony w długotrwałą konwersację
ASP.NET (13) Długotrwałe konwersacje CDI oferuje wbudowany bean do sterowania cyklem życia konwersacji w aplikacji JSF można uzyskać do niego dostęp przez wstrzyknięcie @Inject Conversation conversation; promocja konwersacji związanej z bieżącym żądaniem do długotrwałej konwersacji (ang. long-running) conversation.begin(); zlecenie zniszczenia kontekstu bieżącej długotrwałej konwersacji wraz z końcem bieżącego żądania conversation.end();
ASP.NET (14) Nazwy EL beanów Umożliwiają bezpośrednie odwołania do beanów z poziomu kodu strony jawne nadanie nazwy @Named("cart") @SessionScoped Public class ShoppingCart implements Serializable {... nadanie nazwy domyślnej (nazwa klasy z małej litery) @Named @SessionScoped Public class ShoppingCart implements Serializable {... odwołanie do beana na stronie <h:outputtext value="#{cart.total"/>
ASP.NET (15) Konfiguracja aplikacji CDI W module zawierającym beany wymagany plik beans.xml ze względu na ogólność wymagań stawianym beanom przez CDI, dostarczono mechanizm wskazywania, które archiwa zawierają beany Zawartość pliku beans.xml nie zawiera definicji beanów! może być pusty posiada zawartość gdy wykorzystywane są: interceptory, dekoratory, alternatywy Lokalizacja pliku beans.xml META-INF/beans.xml w module EJB WEB-INF/beans.xml w module webowym