Előadást letölteni
Az előadás letöltése folymat van. Kérjük, várjon
KiadtaRezső Pataki Megváltozta több, mint 10 éve
1
9. Háttér logika Dr. Bilicki Vilmos Szegedi Tudományegyetem
Informatikai Tanszékcsoport Szoftverfejlesztés Tanszék
2
Programrendszerek fejlesztése
Tartalom EJB CDI Szolgáltatások Szkópok Injektálás Minősítő jelölések EL nevek Producer metódusok Alternatívák Specializáció Eseménykezelés Interceptorok Dekorátorok Sztereotípiák Programrendszerek fejlesztése
3
Programrendszerek fejlesztése
Programrendszerek fejlesztése
4
Programrendszerek fejlesztése
EJB rendszer Bean fejlesztő Telepíthető adott funkciót ellátó komponenesket gyárt Alkalmazás szintetizáló Ő látja át az adott problémát és tervezi meg hozzá az alkalkalmazást EJB telepítő Biztonsági, integrációs kérdések (LDAP, tűzfal, …) Rendszer Adminisztrátor Rendszer menedzsment, monitorozás, … Alkalmazás szerver gyártó Fejlesztő eszköz gyártók Programrendszerek fejlesztése
5
Programrendszerek fejlesztése
Erőforrás hozzáférés A JEE komponensek sok fajta erőforráshoz férhetnek hozzá ( , LDAP, fájl, …) A JNDI feladata a név szolgáltatás biztosítása a komponensek számára Programrendszerek fejlesztése
6
Programrendszerek fejlesztése
JNDI Java Naming and Directory Interface A J2EE legfontosabb összetevője (a J2SEE –nek is része) Feladata: Objektumok referenciáinak tárolása kereshető formában Együttműködés a címtár alapú rendszerekkel (amelyek tudják az információt hierarchikusan kezelni) Felépítése: JNDI API Elnevezés menedzser JDNI SPI Szolgáltatók (Service Provider) LDAP COS RMI DNS NIS Fájl Rendszer Windows Reg. Novell Fájl R. Programrendszerek fejlesztése
7
Programrendszerek fejlesztése
Elnevezés, Címtár Elnevezés (Naming): LDAP, DNS, COS, … Kötés – binding Referenciák, Címek Konteksztus (Context) (név-objektum kötés halmaz) Névterek, Elnevezési rendszerek – konteksztusok halmaza Címtár (directory): Az objektumok rendelkeznek tulajdonságokkal is Tulajdonság azonosító Címtár szolgáltatás Directory Schema Keresések, … Programrendszerek fejlesztése
8
Programrendszerek fejlesztése
JNDI csomagok javax.naming Kontesztus (Context) Kezdő kontesztkus (Initial Context) list, lisBindings, bind, reBind, unBind Al kontesztus - subContext Nevek (Name , CompositeName ) String, Name Kötések Referenciák javax.naming.directory Attribútumok lekérdezése DirContext, getAttributes(), modifyAttributes(), search() javax.naming.event javax.naming.ldap (Teljesebb LDAP) LDAP v3 LdapContext javax.naming.spi Programrendszerek fejlesztése
9
Programrendszerek fejlesztése
Kötés, Konteksztus Kötés: bind, rebind, unbind, rename Fruit fruit = new Fruit("orange"); ctx.bind("favorite", fruit); Fruit fruit = new Fruit("lemon"); ctx.rebind("favorite", fruit); ctx.unbind("favorite"); ctx.rename("report.txt", "old_report.txt"); Al kontesztus: createSubcontext, destroySubcontext ctx.createSubcontext("new"); ctx.destroySubcontext("new"); Programrendszerek fejlesztése
10
Programrendszerek fejlesztése
Erőforrás injektálás A konténer automatikusan beinyektálja a megfelelően annotált mezőbe/tulajdonságba Inicializáláskor (mező/tulajdonság) Futás időben (osztály alapú) @Resource Név (name) Típus (type) Azonosítás típusa (authenticationType) Megosztható (shareable) Csatolás neve (mappedName) Leírás (dessc) Programrendszerek fejlesztése
11
Programrendszerek fejlesztése
Elosztott rendszerek Gyakran kliens-szerver Problémák: A távoli objektum megtalálása Bájt kód betöltése Kommunikáció Socket használat RPC használat RMI Corba RMI IIOP SOAP XML RPC Programrendszerek fejlesztése
12
Programrendszerek fejlesztése
RMI Remote Method Invocation Objektum orientált RPC Teljes objektumokat tudunk átküldeni, nem csak előre definiált típusokat Java specifikus Elosztott szemétgyűjtő Biztonságos Egyszerű (nincs IDL) URl szerű: rmi://host:port/objektumnév Programrendszerek fejlesztése
13
Programrendszerek fejlesztése
Különbségek Elosztott vs. Normál Java alkalmazás Távoli objektum hivatkozása használható A Cast ugyanúgy működik instanceOf is A távoli objektumoknál az interfésszel kommunikálunk nem a megvalósító osztállyal A távoli eljárás hívások eredménye és paraméterei érték szerint adódnak át A távoli objektum hivatkozásként adódik át Külön hibakezelés kell Programrendszerek fejlesztése
14
Programrendszerek fejlesztése
Felépítése Java.RMI.remote interfész Ezt kell bővítenünk Minden metódusnál specifikálni kell a java.rmi.RemoteException kivételt A távoli eljárás deklarálásánál a benne szerepelő objektumokat interfészekkel kell megadnunk RemoteException Kommunikációs hiba Paraméter átalakítás hiba Protokol hiba RemoteObject java.lang.Object java.rmi.server.UnicastRemoteObject java.rmi.activation.Activatable Programrendszerek fejlesztése
15
Programrendszerek fejlesztése
Működése Hagyományos RPC megoldás: Csonkok (stubs) elrejtik a hálózati protokollokat és a serializációt Kliens oldali reprezentáció vagy proxy Ugyanazt az interfészt valósítja meg mint a távoli osztály Egy csonk metódus hívás: Kapcsolatot kezdeményez a távoli JVM-mel Átalakítja és átviszi a paramétereket (marshalls) Megvárja az eredményt !!!!!! Kiolvassa és visszaalakítja a paramétereket (unmarshalls) Visszaadja az eredményt a hívónak Vázak (skeletons) a szerver oldali ragasztó (Java2 ben nem kötelező) Szerver oldali reprezentáció: Kiolvassa a paramétereket és visszaalakítja őket (unmarshals) Meghívja a megfelelő objektum megfelelő metódusát Átalakítja és átküldi az eredményt (marshals) Programrendszerek fejlesztése
16
Programrendszerek fejlesztése
Használata Távoli interfész deklarálás public interface WeatherService extends Remote { public List getWeatherInformation() throws RemoteException;} Osztály megvalósítás public class WeatherServiceImpl extends UnicastRemoteObject implements WeatherService { public WeatherServiceImpl() throws RemoteException { super();updateWeatherConditions();} public List getWeatherInformation(){} public static void main( String args[] ) throws Exception {WeatherService service = new WeatherServiceImpl(); String serverObjectName = "rmi://localhost/WeatherService"; Naming.rebind( serverObjectName, service );} Kliens megvalósítás String remoteName = "rmi://" + server + "/WeatherService"; WeatherService weatherService =( WeatherService ) Naming.lookup( remoteName ); List weatherInformation = weatherService.getWeatherInformation(); Fordítás Javac Rmic -> csonk osztályok (rmic –v1.2 -> vázat is gyárt) Futtatás rmiregistry Java Server Java Kliens Programrendszerek fejlesztése
17
Programrendszerek fejlesztése
Paraméter átadás Serializable (menthető) objektumok (java.io.Serializable) Távoli objektumok (nem exportált) Érték szerint adódik át (serialization) Távoli objektumok (exportált) Referencia szerint adódik át (csonk) Referencia integritás Osztály kommentár (Annotation) Az osztály elérési útvonala is átküldődik Paraméter átvitel java.rmi.Remote megvalósító osztály Exportált: csonk adódik vissza Nem exportált: az objektum adódik vissza Egyéb osztály: Programrendszerek fejlesztése
18
Programrendszerek fejlesztése
Enterprise Java Beans EJB: Szerver oldali komponens Java interfészek halmaza Specifikáció mely leírja a komponensek és az alkalmazásszerverek együttműködését Érvek EJB mellett Sokan támogatják Nyílt szabvány, elvileg gyártó független Gyors alkalmazás fejlesztés Platform független Programrendszerek fejlesztése
19
Programrendszerek fejlesztése
EJB Programrendszerek fejlesztése
20
Programrendszerek fejlesztése
EJB típusok Viszony Bab (Session Bean) Az üzleti folyamat modellezésére szolgál Munkafolyamat, árazás, hitel kártya engedélyező, … Entitás Bab (Entity Bean) (CSAK < =EJB2.0) Az üzleti adatot modellezik Termék, egyed, rendelés, … Entitások - JPA (Java Persistence API) (CSAK >= EJB 3.0) Üzenet vezérelt Bab (Message Driven Bean) Hasonló mint a viszony bab, csak üzenetekkel lehet kommunikálni vele Programrendszerek fejlesztése
21
Programrendszerek fejlesztése
EJB példa Programrendszerek fejlesztése
22
Programrendszerek fejlesztése
Az EJB objektum Nem kapcsolódunk közvetlenül az EJB-hez Az EJB tároló elfogja a hívást és delegálja a Bab példánynak (Instance Pooling) EJB objektum ragasztóként funkcionál, Ragasztó Eszköztár A tárló generálja (tárolónként más-más lehet) Implicit MiddleWare Kivételek (transzparent fail- over): Alkalmazás szintű Rendszer szintű Programrendszerek fejlesztése 22
23
Programrendszerek fejlesztése
Mitől EJB az EJB? EJB 2.0 javax.ejb.EnterpriseBean interfész Üres interfész, csak a neve a fontos A java.io.Serializable interfészt bővíti Az alábbi interfészek származnak belőle: javax.ejb.EntityBean javax.ejb.SessionBean javax.ejb.MessageDrivenBean EJB 3.0 POJO @Local ) Programrendszerek fejlesztése
24
Programrendszerek fejlesztése
Entitás kezelés EJB 1,2.0 Entitás bab EJB 3.0, 3.1 Entitás – JPA = Hibernate 3.0 Programrendszerek fejlesztése
25
Programrendszerek fejlesztése
Entitás (>=EJB 3.0) Programrendszerek fejlesztése
26
Viszony bab (Session Bean)
Üzleti folyamatot valósít meg Nem mentődnek el a tartós tároló helyre: Rövid életűek (a kliens kód hívása alatt élnek) Általában nem élik túl a szerver leállásokat Három típusa van: Állapot mentes (Stateless) Egy metódus hívásig él Nem őrzi meg állapotát Minden egyede egyenlő, újrahasznosítható, készletezhető Állapottal rendelkező (Statefull) Több egymást követő kérést tranzakciót képes kiszolgálni Megőrzi az állapotát (a viszony idejére) Készletezés: passivation, activation (erőforrások menedzselése) Singelton Egy van belőle, megőrzi az állapotát Programrendszerek fejlesztése
27
Programrendszerek fejlesztése
Életciklusok Programrendszerek fejlesztése
28
Programrendszerek fejlesztése
Példa public class DiscountRateBean private EntityManager entityManager; private Rate private void init() { rate = entityManager.find(Rate.class, 1); private void destroy() { entityManager.merge(rate); public synchronized void setRate(Rate rate) { this.rate = rate; public synchronized Rate getRate() { return rate; Programrendszerek fejlesztése
29
Programrendszerek fejlesztése
Teljes működés Programrendszerek fejlesztése
30
Üzenet vezérelt bab (Message driven bean)
Az előző komponensek RMI-IIOP-ot használtak kommunikációra Hátrányai: A kliensnek várnia kell a válaszra (nem engedélyezetett a szál kezelés !!) Nem megbízható Egyszerre csak egy egyeddel kommunikál Message Oriented MiddleWare MSMQ, IBM MQSeries, … cég függő JMS szabványos igyekszik lenni (API/SPI) Programrendszerek fejlesztése
31
Programrendszerek fejlesztése
JMS API Messaging Domains: Publish/subscribe Point-to-Point Programrendszerek fejlesztése 31
32
Programrendszerek fejlesztése
Üzenet vezérelt bab Teljesen el van különítve a többi komponenstől Nincs home, remote, local, localhome interfész Egy üzleti metódusuk van onMessage() menet közben deríti ki mit is kapott (instanceof) Nincs visszatérési értékük Nem tudnak kivételt küldeni a küldőnek Állapotmentesek Tartós vagy nem tartós listatagok Tartós – minden üzenetet megkap akkor is ha nem aktív Nem tartós csak azokat kapja meg amikor aktív volt javax.jms.MessageListener onMessage() javax.ejb.MessageDrivenBean ejbRemove setMessageDrivenContext Programrendszerek fejlesztése
33
Programrendszerek fejlesztése
Példa: Bean Programrendszerek fejlesztése
34
Programrendszerek fejlesztése
Tranzakció kezelés A tranzakciók használata bevált megoldás az adat integritás megőrzése érdekében Hibák, komplex helyzetek Több felhasználó kezelése A folyamatokat munka egységekbe tudjuk osztani Hogyan oldjuk ezt meg amennyiben nem adatbázisban végezzük el a megfelelő műveleteket EJB két típust támogat Bab által kezelt tranzakciók Konténer által kezelt tranzakciók Programrendszerek fejlesztése
35
Konténer által kezelt tranzakció kezelés
A konténer szabja meg a tranzakció határokat Viszony és üzenet babbal tudjuk használni Egyszerűsíti a fejlesztést mert alapesetben nem kell vele foglalkoznunk Tipikus eset A tároló adott bab metódus meghívásával egy új tranzakciót kezd amit befejez amint a metódus visszatért Minden metódus egy-egy külön tranzakció Nem lehet egyszerre használni a bab által kezelt tranzakció kezeléssel Metódus szinten specifikálhatjuk a tranzakció igényeket Programrendszerek fejlesztése
36
Programrendszerek fejlesztése
Tranzakció hatóköre Programrendszerek fejlesztése
37
Programrendszerek fejlesztése
Példa Programrendszerek fejlesztése
38
Bab által kezelt tranzakció kezelés
Akkor szokták használni a ha a tranzakció határokat kézben szeretnénk tartani Az előzőnél egy metódus egy tranzakcióhoz tartozhat JDBC vagy JTA tranzakciókezelést lehet használni Programrendszerek fejlesztése
39
Programrendszerek fejlesztése
Programrendszerek fejlesztése
40
Programrendszerek fejlesztése
JSF vs. Seam JSF JSF Page POJO Facade Session EJB Entity EJB POJO Facade JSF Page Managed Bean SEAM JSF Page Session EJB JSF Page Entity EJB Automatically wrapped in Managed Bean Programrendszerek fejlesztése
41
Programrendszerek fejlesztése
JSF életciklus Programrendszerek fejlesztése
42
Programrendszerek fejlesztése
Seam életciklus Programrendszerek fejlesztése
43
Programrendszerek fejlesztése
SEAM 3.0 EJB komponensek JSF Bean-ekként való használatának támogatása Annotációk használata a kontextusok változóinak manipulálására Javított kontextus modell + két új kontextus: Conversation Business Process Interfész munkafolyamat-motorok könnyű integrálásához JPA integrálása Annotációk biztosítása JSF metaadatok számára JSR-227 támogatás biztosítása Programrendszerek fejlesztése
44
faces-config.xml vagy pages.xml
Példa: Navigáció faces-config.xml vagy pages.xml Navigációs szabályok Init akciók használata navigálás előtt Request paraméterek kezelése EL kifejezések használata pageflow Programrendszerek fejlesztése
45
Programrendszerek fejlesztése
Megoldás Web Beans JSR-299 specifikáció Egyesíti a JSF Managed Bean komponens modellt az EJB komponens modellel Egyszerűsített programozási modellt ad web alapú alkalmazások fejlesztéséhez Nincs szükség a Java EE környezet mély ismeretére Javított kontextus modell Programrendszerek fejlesztése
46
Programrendszerek fejlesztése
Mi egy Web Bean? Komponens típusai: Bármilyen Java osztály EJB session és singleton bean-ek Feloldó metódusok JMS komponensek Távoli komponensek Alap építőelemek: Telepítési típusok API típusok Kötési típusok Elnevezések Implementálások Programrendszerek fejlesztése
47
Programrendszerek fejlesztése
Web Beans céljai EJB komponensek JSF Bean-ekként való használatának támogatása Annotációk használata a kontextusok változóinak manipulálására Javított kontextus modell + két új kontextus: Conversation Business Process Interfész munkafolyamat-motorok könnyű integrálásához JPA integrálása Annotációk biztosítása JSF metaadatok számára JSR-227 támogatás biztosítása Programrendszerek fejlesztése
48
Adaptálás meglévő rendszerekhez
Létező EJB3 session bean-ekből Web Bean-ek készítése annotációkkal Létező JSF managed bean-ekből Web Bean-ek készítése annotációkkal Új Web Bean komponensekbe meglevő EJB3 session bean-ek injektálása annotációval vagy JNDI-ből Új EJB-ben létező Web Bean komponensek használata injektálással vagy interceptorral Programrendszerek fejlesztése
49
Programrendszerek fejlesztése
Web Beans újdonságai A Web Beans lényege a laza csatolás Szerver és kliens oldal elválasztása jól definiált API-k és kötési típusok alkalmazásával Az implementáció felüldefiniálható telepítési időben Az együttműködő komponensek életciklusainak elkülönítése Komponensek életciklusának automatikus menedzsmentje Stateful komponensek szolgáltatásokként való használata Ortogonális nézetek leválasztása a programkódtól Interceptorok használata (logging, security, transactions) Az üzenetek küldőinek és fogadóinak szétválasztása Event-ke használata A Web Beans egyesíti a web réteget és az üzleti réteget Egy komponens elérheti a request scope adatait és használhat tranzakciós erőforrást is egyben Programrendszerek fejlesztése
50
Programrendszerek fejlesztése
<HTML> <HEAD><TITLE>Login Page</TITLE></HEAD> <BODY BGCOLOR=”white”> <f:view><h:form> Login name: Password: </h:from></f:view> </BODY> </HTML> @Stateless public class LoginAction { @PersistenceContext private EntityManager em private String username = “”; } @Name(“loginComp”) taglib uri=“ prefix=”h”%> taglib uri=“ prefix=”f”%> @In private Context sessionContext; public void setUserName(String username) { this.username = username; } <h:input_text id=”name” value=”#{loginComp.userName}”/> <h:input_text id=”password” value=”#{loginComp.password}”/> public String login() { try { User user = (User) em.createQuery(„FROM ...“) .getSingleResult(); sessionContext.set(„currentUser", user); return “login“; } catch (Exception e) {…} } <h:command_button action=”#{loginComp.login}” value=”Login”/> Programrendszerek fejlesztése
51
Contexts and Dependency Injection
Feladata a különböző rétegek együttműködésének elősegítése Alapelve: Laza Csatolás Alapvető szolgáltatásai: Kontextusok támogatása Az állapottartó komponenseket kontextusokhoz köthetjük Függőségek injektálása Komponenseket tudunk típusosan egy alkalmazásba injektálni Telepítés időben dönthetünk az implementációról Programrendszerek fejlesztése
52
Contexts and Dependency Injection
CDI – JSR 299 Programozási model Öröklődés és specializáció Függőség injektálás és EL Szkópok, kontextusok Életciklusok Dekorátorok Interceptorok és kötések Események Programrendszerek fejlesztése
53
Programrendszerek fejlesztése
CDI szolgáltatások EL segítségével elérhetőek a komponensek Dekorálhatjuk az injektált objektumokat A komponensekhez interceptorokat rendelhetünk Esemény kezelő model Új szkóp Programrendszerek fejlesztése
54
Programrendszerek fejlesztése
CDI Bab A CDI által meghatározott kontextusok mentén menedzseli az életútját Egy CDI bab az alábbi tulajdonságokkal rendelkezik: Típus Minősítések (Qualifier) Szkóp EL név (opcionális) Interceptor kötések (opcionális) Implementáció Programrendszerek fejlesztése
55
Programrendszerek fejlesztése
Minősítő jelölések Egy babnak különböző implementációi lehetnek Ezeket jelölni tudjuk a minősítő jelölésekkel Ha nincs semmi Programrendszerek fejlesztése
56
Babok mint injektálható objektumok
Szinte bármilyen Java osztály Viszony babok Java EE erőforrások Perzisztencia kontextusok Producer mezők A producer metódusok által visszaadott objektumok Web szolgáltatás referenciák Hivatkozások távoli EJB-re Programrendszerek fejlesztése
57
Programrendszerek fejlesztése
Babok injektálása A konténer az anotáció szerint példányosítja és injektálja a megadott objektumot Programrendszerek fejlesztése
58
Programrendszerek fejlesztése
Szkópok használata Az objektum láthatóságát élettartamát adja meg Használható szkópok (sajátokat is lehet definiálni): Request Session Application Dependent Conversation Programrendszerek fejlesztése
59
Programrendszerek fejlesztése
A conversation szkóp Hasonló a session hatókörhöz, állapotokat tart és rendel felhasználókhoz a rendszerben több request-en keresztül a következő két különbséggel: A életciklusának határait az alkalmazás kezeli Az állapotot egy adott böngészőhöz rendeli Egy conversation egy feladatot reprezentál a felhasználó szemszögéből, több feladat esetén több conversation keletkezik A conversation hatókör minden JSF request esetén aktív és legtöbb esetben a request végén véget is ér. Több requesten keresztül tartó conversation-t hosszú futású (long-running) conversation-nek nevezzük. Programrendszerek fejlesztése
60
Programrendszerek fejlesztése
Függő pseudo-scope A négy beépített hatókör mellett a Web Bean specifikál egy default Minden Web Bean, amely nem definiálja a hatókörét, ebbe a hatókörbe sorolandó Egy függő Web Bean-re való hivatkozás (injektálás) esetén mindig létrejön egy példány a függő bean-ből, valahányszor az injektáló példányosítva van A függő Web Bean-ek példányai sosem lesznek megosztva komponensek között, egy ilyen példány a példányosító Web Bean-től „függ” Az életciklusa is tőle függ, akkor lesz megszüntetve, amikor a példányosító megszűnik Programrendszerek fejlesztése
61
Programrendszerek fejlesztése
EL nevek használata Ha nem adjuk meg akkor az osztály neve @Name Programrendszerek fejlesztése
62
Programrendszerek fejlesztése
Producer metódusok Lehetővé teszik nem babok, vagy speciális inicializálási igényű objektumok injektálását Programrendszerek fejlesztése
63
Alternatívák használata
Amennyiben fejlesztési időben egy bab több verziója is szükséges Ha nincs megjelölve Programrendszerek fejlesztése
64
Programrendszerek fejlesztése
Specializáció Hasonló mint az alternatíva, de azt akarjuk, hogy mindég cserélje le: Programrendszerek fejlesztése
65
Programrendszerek fejlesztése
Producer mező Hasonló mint a producer metódus, csak ez egy mező Programrendszerek fejlesztése
66
Programrendszerek fejlesztése
Eseménykezelés Események segítségével a fordításidőbeli függőségek figyelembe vétele nélkül lehet kommunikálni: laza csatolás Egy bab definiálhat egy eseményt egy másik elküldheti egy harmadik pedig fogadhatja azt Esemény Java objektum Lehet minősítő jelölése Programrendszerek fejlesztése
67
Programrendszerek fejlesztése
Megfigyelő - Observer Observer metódus az esemény elkapására Lehet feltételes Lehet tranzakcionális Akkor értesíti az eseményről ha a típusa és az összes minősítő megjelölése megegyezik Programrendszerek fejlesztése
68
Események létrehozása
Programrendszerek fejlesztése
69
Programrendszerek fejlesztése
Interceptorok A keresztülívelő, ortogonális problémák kezelésére Minden menedzselt objektumra használható @AroundInvoke @PostConstruct @PreDestroy @PrePassivate @PostPassivate @AroundTimeout Programrendszerek fejlesztése
70
Programrendszerek fejlesztése
Dekorátorok Szerepük az üzleti tervezési minták megvalósítása Egy dekorátor egy vagy több dekorált osztályt egészít ki új képességekkel Programrendszerek fejlesztése
71
Programrendszerek fejlesztése
Sztereotípusok Egy olyan annotáció amely más annotációkat helyettesít Egyfajta annotáció csoportképzés Programrendszerek fejlesztése
72
Egy egyszerű példa: Komponens
@Component egy beépített stereotípus public @Component class Hello { public String hello(String name) { return "hello " + name; } Programrendszerek fejlesztése
73
Egy egyszerű példa: Kliens
@Current egy beépített kötési típus public @Component class Printer { @Current Hello hello; public void hello() { System.out.println(hello.hello("world")); } Programrendszerek fejlesztése
74
Egy egyszerű példa: Konstruktor injektálás
A konstruktorok paraméterei default injektálódnak public @Component class Printer { private Hello hello; public Printer(Hello hello) {this.hello=hello;} public void hello() { System.out.println(hello.hello("world")); } Programrendszerek fejlesztése
75
Egy egyszerű példa: Initializer használata
Példányosítás utáni callback a paraméterek injektálására public @Component class Printer { private Hello hello; @Initializer void initPrinter(Hello hello) {this.hello=hello;} public void hello() { System.out.println(hello.hello("world")); } Programrendszerek fejlesztése
76
Programrendszerek fejlesztése
Komponensek nevei Alapértelmezetten a komponensek nem elérhetőek EL kifejezésekben. Ha nem adunk meg nevet, egy default név rendelődik hozzá public @Component @Named("hello") class Hello { public String hello(String name) { return "hello " + name; } Programrendszerek fejlesztése
77
JSF oldalak <h:commandButton
Web Bean metódus hívása EL kifejezéssel <h:commandButton value="Say Hello" action="#{hello.hello}" /> Programrendszerek fejlesztése
78
Programrendszerek fejlesztése
Kötési típusok A kötési típus egy annotáció, amely lehetővé teszi a kliens számára, hogy több implementáció közül választhasson egy API-ból futási időben String alapú nevek használata feloldásnál @Current az alapértelmezett kötési típus Programrendszerek fejlesztése
79
Kötési típus definiálása és használata
public @BindingType @Retention(RUNTIME) @Target({TYPE,METHOD,FIELD,PARAMETER}) @interface Casual {} kötési típus specifikálása public @Casual @Component class Hi extends Hello { public String hello(String name){ return "hi " + name; } A Hello komponens injektálása és implementáció elkérése public @Component class Printer { @Casual Hello hello; public void hello(){ System.out.println( hello.hello("JBoss Compass") ); } Programrendszerek fejlesztése
80
Programrendszerek fejlesztése
Telepítési típusok A telepítési típus egy annotáció, amely Web Bean- ként azonosít egy osztályt Telepítési típusok engedélyezhetőek és tilthatóak, ezzel biztosítva komponensek egész csoportjainak engedélyezését és tiltását telepítési időben Van egy precedencia sorrendje a telepítési típusoknak, így segítve a futtatási környezetet, hogy különböző implementációk között választhasson egy API-ból A telepítési típusok lecserélik az XML alapú konfigurációkat Az alapértelmezett telepítési típus: Production Programrendszerek fejlesztése
81
Telepítési típus definiálása, használata
public @DeploymentType @Retention(RUNTIME) @Target({TYPE,METHOD}) @interface Espanol {} Ugyanaz az API, különböző implementáció public @Espanol @Component class Hola extends Hello { public String hello(String name){ return "hola " + name; } A felsorolás sorrendje fontos! Csak az itt felsorol telepítési típusok lesznek elérhetőek az alkalmazásban <web-beans> <component-types> <component-type>javax.webbeans.Standard</component-type> <component-type>javax.webbeans.Production</component-type> <component-type>org.jboss.i18n.Espanol</component-type> </component-types> </web-beans> Programrendszerek fejlesztése
82
Programrendszerek fejlesztése
Perzisztencia Processz szintű -> zárolás, versenyhelyzet detektálás Tranzakció szintű -> Laza betöltés problémája EJB3 komponens szintű -> komponensek közötti átadás Konverzáció szintű szkóp Programrendszerek fejlesztése
83
Hatókörök és kontextusok
A hatókörök meghatározzák egy Web Bean példányainak életciklusát Összekapcsolják a klienst, és az adott klienshez tartozó példányokat Bővíthető kontextus modell, új annotációk készítésével Beépített hatókörök: @RequestScoped @SessionScoped @ApplicationScoped @ConversationScoped Programrendszerek fejlesztése
84
Programrendszerek fejlesztése
Programrendszerek fejlesztése
85
Programrendszerek fejlesztése
Tartalom EJB CDI Szolgáltatások Szkópok Injektálás Minősítő jelölések EL nevek Producer metódusok Alternatívák Specializáció Eseménykezelés Interceptorok Dekorátorok Sztereotípiák Programrendszerek fejlesztése
Hasonló előadás
© 2024 SlidePlayer.hu Inc.
All rights reserved.