Vybrané partie z jazyka Java Spring a Enterprise JavaBeans (EJB) Michal Papež
Spring & EJB Program: K čemu je to dobré, historie, odlišnosti Spring 2.5 EJB 3.0
K čemu jsou? 1 Vývoj velkých podnikových řešení Znovupoužitelnost Volné vazby Transakce Deklarativní rozhraní, protokoly Persistence Bezpečnost Distribuované aplikace, výpočty
K čemu jsou? 2 Třívrstvá architektura IS / datová Aplikační: Legacy systémy zprávy Business nebo process logic deklarativní Presentační / klientská Services, SOA tencí klienti
Vývoj starší EJB EJB před verzí 3 Náročný vývoj příliš složité Robusní, komplexní řešení Pro největší aplikace Problémy, např. s testováním 1998 Standard IBM (Web Sphere), BEA (Weblogic), Oracle (JDeveloper)
Vývoj Spring Spring Rod Johnson, 2002 Reakce na EJB Snahy Jednoduššeji Standardní JavaBeans Lehčí řešení Není třeba vše implementovat, stačí dobrá integrace pro stávající (otevřené) frameworky Interoperabilita s EJB
Vývoj EJB 3 EJB 3 Sun Microsystems 2003 2006 Inspirováno Springem Jednodušší Použitelnější Nejsou třeba implementovat některé interface Ubyly zbytečné callback metody xy... Nahrazeno anotacemi Dříve prosyceno java.rmi.remoteexception Dependency Injection (viz dále) Context ne úplně jako Spring (mix s lookup)
Spring komponenty 1 Core Container BeanFactory IOC viz dále Spring Context Konfigurační soubor.xml Aspect Oriented (AOP) Např. transakce Aplikace instruována anotacemi DAO (Data Access Object) Abstrakce nad přístupem k DB (JDBC, )
Spring komponenty 2 Object Relational (ORM) JDO, Hibernate, OJB and ibatis SQL Maps Web (context) module Jakarta Struts, JSF and webworks MVC Framework Web aplikace pohledy: JSP, Velocity, Tiles, PDF, XLS
Spring Architektura
Inversion of Control (IoC) Objekty se nepropojují v kódu, ale v konfiguračním souboru Objekt není zodpovědný za hledání svých závislostí Závislosti nadeklarovány Kontejner je dodá nastaví konkrétní objekty pomocí setterů Obvyklá jmenná konvence setxxx()
Property namebean.java public class namebean { String name; public void setname(string a) { name = a; } context.xml <bean id="bean1" class="namebean"> <property name="name" > <value>tom</value> </property> </bean> } public String getname() { return name; }
Konstruktor namebean.java public class namebean { String name; } public namebean(string a) { name = a; } context.xml <bean id="bean1" class="namebean"> <constructor arg> <value>my Value</value> </constructor arg> </bean> Obdobně Init() metoda Ukázka jednoduchá konzolová
Provázání context.xml... <bean id="bean" class="beanimpl"> <property name="conn"> <ref bean="bean2"/> </property> </bean> <bean id="bean2" class="bean2impl"/>... Reference Dědění context.xml... <bean id="parent" class="mybean" > <property name="name" value="xxx"/> </bean> <bean id="child" class="mybean" parent="parent"> <property name="address value="prague"/> </bean>... Ukázka servlet + update konfigurace
Spring a databáze Data access JDBC, JDO Object Ralational Mapping Hibernate, OJB, ibatis, Např. org.springframework.jdbc.datasource.drivermanagerdatasource Ukázka servlet & JDBC & MySQL
Remoting Modely: RMI, Hessian, Burnlap, HTTP invoker, EJB, JAX RPC Vše přes konfigurační soubor RMI: RmiProxyFactoryBean, RmiServiceExporter EJB Není třeba žádný lookup, abstract support classes pro jednotlivé typy beanů Viz dále Ukázka RMI
EJB 3 Funkce Zpráva transakcí Bezpečnost pomocí atributů, ne API Zpráva zdrojů a životního cyklu Remoting Concurrency Control Detekce, zámky Clustery, vyvažování zátěže
Typy beanů Session bean Synchronní komunikace Interakce s klientem aplikační vrstva Message driven bean Asynchronní komunikace Služby, spíš nejnižší vrstva
Session beans
Session beans Interakce s uživatelem Business logika, algoritmy, procesy, Ne práce s daty, na to jsou jiné (EntityBean) Životní cyklus Pro jednoho klienta Nepersistentní @PreConstruct, @PreDestroy, @PrePassivate, @PostActivate,... Použití První 2 pažadavky viz životní cyklus Web servisy
Stateless session beans Bezestavové (stateless) Jedno volání metody, pak destroy Jednoduchost škálovatelnost, výkon @Stateless Ukázka
Statefull session beans Stavové (statuful) konverzace, např. účet
Message driven beans Motivace problémy s RMI Čekání... Těsnost vazeb přímá komunikace Spolehlivost chvilkový výpadek je problém Nelze jinak, než 1:1 Alternativa Java Message Services (JMS)
JMS & Message driven beans Modely: Point to Point Publish/Subscribe @MessageDriven Která fronta se má poslouchat Implements MessageListener Možno @Resource MessageDrivenContext
POJO Plain Old Java Object, Plain Old Java Interface Integrace normálních Java objektů do EJB Výhody: Snadné testování Rychlý vývoj Není vazba na EJB framework Nevýhody Je třeba se vypořádat s transakcemi a perzistencí jinak Viz implementace service v ukázce Spring RMI
EntityBeans, JPA Java Persistence API Pro objekty a vztahy mezi nimi Načítání, ukládání, mazání databáze Primitivní typy, kolekce, některá pole EJB QL javax.persistence.entitymanager @Entity, @Table @Id, @GeneratedValue, @SequenceGenerator @OneToOne, @OneToMany, @ManyToMany Např. OneToMany(cascade=REMOVE, mappedby="customer")
Životní cyklus entity Řízeno pomocí EntityManageru
Závěrem... K čemu je to dobré? Srovnání Dotazy?