Enterprise JavaBean
Transkrypt
Enterprise JavaBean
Enterprise JavaBean
EJB 2.x oraz zmiany w standardzie dla EJB 3.0
Michał Stanek
Plan prezentacji
Czym jest EJB
Architektura aplikacji J2EE oraz kontener
EJB
Typy komponentów JavaBean
EJB 1.0, EJB 2.x
Wady EJB 2.x zmiany wprowadzone w
EJB 3.0
Kilka przykładów
Czym jest EJB
EJB jest częścią specyfikacji/platformy J2EE
EJB komponent po stronie serwera
EJB enkapsuluje logikę/obiekty biznesowe
EJB ma uprościć proces wytwarzania
oprogramowania
EJB – to również cienki klient
Możliwość zakupienia gotowych komponentów
EJB od innych dostawców
Architektura Aplikacji J2EE
Architektura aplikacji J2EE
Kiedy używa się EJB
Aplikacja ma być „skalowalna” ( lokalizacja
komponentów EJB jest transparentna dla
klienta )
W celu zapewnienia integralności danych
musimy wprowadzić transakcje
Istnieje wiele różnorodnych klientów naszej
aplikacji.
Kontener EJB
Czym zajmuje się Kontener EJB
Izoluje EJB przed bezpośrednimi wywołaniami
z zewnątrz (wszystkie wywołania są
przechwytywane przez kontener)
Zapewnia automatycznie:
Persystencję obiektów
Transakcje
Bezpieczeństwo
Kontener zarządza jednocześnie wieloma EJB
(podobnie jak kontener servletów)
Rodzaje EJB
Enterprise JavaBean
Session Bean
Stateless
Stateful
Entity Bean
CMP
BMP
Message-Driven Bean
Session EJB
Reprezentuje pojedynczego klienta aplikacji.
Session Bean nie jest dzielony pomiędzy
klientami.
Session Bean nie jest persystentny ( istnieje
second storage)
Kiedy klient kończy połączenie Session Bean
jest zwalniany (pooling, zwolnienie zasobu)
Stateless Session Bean
Bean nie przechowuje stanu pomiędzy
kolejnymi wywołaniami klienta
W ramach wywołania bean może mieć stan,
może korzystać z Entity Bean, zewnętrznych
zasobów, itp…
Nie są nigdy zapisywane przez kontener
Są „lżejsze” od Stateful Session Bean
Statefull Sesion Bean
Pomiędzy kolejnymi wywołaniami klienta
zachowywany jest stan „konwersacji”
Jest bardziej obciążający dla kontenera
Entity EJB
Entity Bean reprezentuje obiekt biznesowy.
Entity Bean jest z natury persystentny (z reguły
obiektowi Entity Bean odpowiada tabela w
Relacyjnej bazie danych).
Posiada klucz główny
Może pozostawać w związkach z innymi Entity
Beans
Może być dzielony pomiędzy wielu klientów
CMP i BMP Entity Bean
Bean Managed Persistency:
Musimy sami oprogramować persystencję obiektu
Container Managed Persistency:
Kontener zajmuje się zapisem i odczytem beana z
bazy danych
Nie trzeba pisać nawet jednej linijki w SQL’u
Zapewniamy większą przenośność naszego Beana
Aby zapewnić persystencję musimy dostarczyć
jedynie Entity Bean Abstract Schema
Abstract Schema
Definiuje jakie pola w Entity
Bean są persystentne
Określa związki Entity Bean z
innymi obiektami
Musimy podać nazwę
Abstract Schema w
deskryptorze wdrożenia
Dla CMP Bean musimy za
pomocą EJB QL zdefiniować
każdą metodę find (oprócz
findByPrimaryKey)
Kiedy używać Entity Bean
Bean reprezentuje obiekt biznesowy, a
nie procedurę ( CreditCardBean,
CreditCardVeriferBean)
Stan obiektu musi pozostać persystentny
Message Driven Bean
W odróżnieniu do poprzednich pozwala przetwarzać komunikaty
asynchronicznie
Działa podobnie do Listnera zdarzeń – otrzymuje JMS message zamiast
event
Komunikat może być wysłany przez dowolny komponent J2EE (klienta,
Enterprise JavaBeana, komponent Webowy)
Klient nie wywołuje M-D Beana przez jakikolwiek interfejs.
Każdy M-D Bean jest równoważny (jest bezstanowy)
Jest efektywniejszy niż inne Beany – nie jest podejmowana konwersacja z
serwerem.
Ogólny proces tworzenia
komponentu EJB
Przygotowanie kodu źródłowego klasy Java, reprezentującej komponent
EJB
Utworzenie dwóch interfejsów Java, reprezentujących punkty kontaktu
świata zewnętrznego z komponentem EJB:
interfejs Home, służący do zarządzania cyklem życia komponentu EJB
interfejs Remote/Local, służący do wywoływania metod logiki biznesowej
komponentu EJB
Przygotowanie XML-owego pliku konfiguracyjnego - deskryptora instalacji
(Deployment Descriptor)
Kompilacja całego przygotowanego kodu Java i utworzenie z niego pliku
JAR/EAR o specjalnej wewnętrznej strukturze katalogów
Umieszczenie przygotowanych plików w systemie plików serwera
aplikacji; zarejestrowanie komponentu EJB
Implementacja EJB
Tworzenie Beana
public interface Calculator extends EJBObject {
int add (int a, int b) throws RemoteException;
int subtract (int a, int b) throws RemoteException;
}
public interface CalculatorHome extends EJBHome {
Calculator create() throws CreateException,
RemoteException;
}
Tworzenie Beana
public class CalculatorBean implements SessionBean {
private SessionContext ctx;
public void setSessionContext(SessionContext s)
{ctx = s;}
public void ejbCreate() {}
public void ejbActivate () {}
public void ejbPassivate () {}
public void ejbRemove () {}
public int add (int a, int b) {
return a + b;
}
public int subtract (int a, int b) {
return a – b;
}
}
Tworzenie Beana
<session>
<ejb-name>CalculatorEJB</ejb-name>
<home>com.example.CalculatorHome</home>
<remote>com.example.Calculator</remote>
<ejb-class>com.example.CalculatorBean</ejb-class>
<session-type>Stateless</session-type>
<transaction-type>Container</transaction-type>
</session>
...
Przykładowy deskryptor wdrożenia
Historia EJB
EJB 1.0
XML-owy deskryptor wdrożenia
Transakcje na poziomie metod,
zabezpieczenia
Brak asocjacji
CMP zależne od kontenera
Specyficzna deklaracja „finderów”
Historia EJB
EJB 2.x:
CMR dla asocjacji
Standaryzacja deskryptora wdrożenia dla
CMP
Wprowadzenie EJB QL
Dodano Message Driven Bean
Wady EJB 2.x
„Brzydki” styl programowania – javax.ejb
Bardzo złożony deskryptor wdrożenia
Pomieszana implementacja sprawdzanych
oraz nie sprawdzanych wyjątków
Brak polimorfizmu
Brak możliwości testowania poza kontenerem
EJB QL – zbyt ograniczony ( brak
agregacji/projekcji, brak outer-join’a, brak
paginatora … )
Założenia EJB 3.0
Redukcja liczby generowanych artefaktów
Eliminacja konieczności dostarczenia deskryptora
wdrożenia
Umożliwienie generowania interfejsów bezpośrednio z
klasy Beana
Uproszczenie tworzenia Enterprise JavaBean
Eliminacja implementowanych interfejsów
Założenia EJB 3.0
Uproszczenie tworzenia CMP Entity Bean
Wprowadzenie dziedziczenia i polimorfizmu
Rozszerzenie języka EJB QL m.in. o:
Podzapytania
Zapytania dynamiczne
Projection
Explicit inner oraz outer join
Group by, Having
Wsparcie dla natywnych wywołań SQL
EJB 3.0 – Stateless Session Bean
@Remote public interface Calculator {
public int add(int x, int y);
public int subtract(int x, int y);
}
@Stateless public class CalculatorBean implements Calculator {
public int add(int x, int y) {
return x + y;
}
public int subtract(int x, int y) {
Return x – y;
}
}
Stateless + generowany interfejs
@Stateless public class CalculatorBean
implements Calculator {
public int add(int x, int y) {
return x + y;
}
public int subtract(int x, int y) {
Return x – y;
}
}
Deskryptor wdrożenia
Co zrobiliśmy?
Eliminacja Interfejsu domowego(Home
Interface)
Obiekt jest zwykłym obiektem POJO
(Plain Old Java Object)
Tylko jeden artefakt
Możliwość automatycznego generowania
interfejsu
Łatwość testowania za pomocą JUnit
Simpliefied Entity Bean
@Entity(table="Aukcja") public class Aukcja {
@PK (column="AukcjaID", generator="sequence")
private Long id;
@Attribute
private String opis;
@OneToMany (inverse="auction" order-by="data")
private Set<Rachunek> rachunek = new HashSet();
@ManyToOne (fk="sprzedawcaId")
private User sprzedawca
@Attribute(formula="Select Max(R.Suma) from Rachunek R" +
"where R.AukcjaID = AuctionID")
private BigDecimal maxSumaRachunku;
public BigDecimal getMaxSumaRachunku() {
return maxSumaRa
}
}
Zalety …
Uproszone projektowanie oraz programowanie
Możliwość użycia obiektów poza kontenerem
Łatwość testowania
Usunięcie konieczności wykorzystywania
wzorca projektowego DTO (Data Transfer
Object)
BMP – jest już w zasadzie bezcelowy
Mapowanie O/R oraz EJB QL
Użycie metadanych do określenia mapowania
Wprowadzenie polimorfizmu i dziedziczenia:
Table per class
Table per class hierarchy
Rozszerzenie możliwości EJB QL m.in. o:
Bulk update i delete
Projection
Group by, Having
Podzapytania
Bulk update/delete
DELETE
FROM Klient k
WHERE k.status = „nieaktywny”
UPDATE Klient k
SET k.status = „nieaktywny”
WHERE c.zamowienia=0
Podzapytania
SELECT dobryKlient
FROM Klient dobryKlient
WHERE dobryKlient.zamowienia < (
SELECT avg(k.zamowienia)
FROM Klient k
)
Podsumowanie
Znaczna ewolucja poczynając od EJB 1.0 a kończąc
na EJB 3.0
Uproszczenie modelowania złożonych systemów.
Uniezależnienie się od konkretnych kontenerów
serwletów.
Skrócenie czasu wytwarzania oraz projektowania
aplikacji.
Łatwość testowania (możliwość pracy wg. Metodyki
Test Driven Development)
Resin – kontener EJB 3.0
Literatura
The J2EE™ 1.4 Tutorial
JSR 220: Enterprise JavaBeansTM,Version 3.0
- EJB 3.0 Simplified API
JSR 220: Enterprise JavaBeansTM,Version 3.0
- Persistence API
From EJB to Hibernate to EJB 3 – Gavin King
(Jboss inc.)
EJB 3.0 Work in progress – Linda De Michiel
(EJB 3.0 Spec Lead)
Literatura - książki
Ed Roman – „Mastering Enterprise
JavaBean 2nd edition”
Richard Monson-Haefel – „EJB 3RD
EDITION”