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á
Legacy systémy
zprávy
Aplikační:
deklarativní
Presentační / klientská
Business nebo process logic
”tencí” klienti
Services, SOA
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 (WebSphere), 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 20032006
Inspirováno Springem
Jednodušší
Nejsou třeba implementovat některé interface
Ubyly zbytečné callback metody xy...
Nahrazeno anotacemi
Dříve prosyceno java.rmi.remoteException
Použitelnější
Dependency Injection (viz dále)
Context – ne úplně jako Spring (mix s lookup)
Spring – komponenty 1
Core Container
Spring Context
BeanFactory – IOC viz dále Konfigurační soubor .xml
AspectOriented (AOP)
Např. transakce
Aplikace instruována anotacemi
DAO (Data Access Object)
Abstrakce nad přístupem k DB (JDBC, … )
Spring – komponenty 2
Object Relational (ORM)
Web (context) module
JDO, Hibernate, OJB and iBatis SQL Maps 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
<property name="name" > Tom
public String getName() { return name; } }
Konstruktor namebean.java public class nameBean { String name; public nameBean(String a) { name = a; } }
context.xml
My Value
Obdobně Init() metoda
Ukázka – jednoduchá konzolová
Provázání context.xml ...
<property name="conn"> ...
context.xml ...
<property name="name" value="xxx"/> <property name="address” value="Prague"/> ...
Reference
”Dědění”
Ukázka – servlet + update konfigurace
Spring a databáze
Data access
Object Ralational Mapping
JDBC, JDO Hibernate, OJB, iBatis, …
Např. org.springframework.jdbc.datasource.DriverManagerDataSource
Ukázka – servlet & JDBC & MySQL
Remoting
Modely:
RMI, Hessian, Burnlap, HTTP invoker, EJB, JAXRPC
Vše přes konfigurační soubor
RMI: RmiProxyFactoryBean, RmiServiceExporter
Není třeba žádný lookup, …
EJB
abstract support classes – pro jednotlivé typy beanů
Viz dále
Ukázka RMI
EJB 3
Funkce
Zpráva transakcí
Bezpečnost
Zpráva zdrojů a životního cyklu
Remoting
Concurrency Control
pomocí atributů, ne API
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í
Použití
@PreConstruct, @PreDestroy, @PrePassivate, @PostActivate, ...
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:
PointtoPoint
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 SpringRMI
EntityBeans, JPA
Java Persistence API
Načítání, ukládání, mazání – databáze
Primitivní typy, kolekce, některá pole
EJBQL javax.persistence.EntityManager
@Entity, @Table
@Id, @GeneratedValue, @SequenceGenerator
@OneToOne, @OneToMany, @ManyToMany
Pro objekty a vztahy mezi nimi
Např. OneToMany(cascade=REMOVE, mappedBy="customer")
Životní cyklus entity
Řízeno pomocí EntityManageru
Závěrem...
K čemu je to dobré?
”Srovnání”
Dotazy?