no-tier enterprise application mit cdi
DESCRIPTION
Der Einsatz von Java EE führt meist zu Anwendungen, die einer klassischen serviceorientierten Mehrschichtarchitektur entsprechen. Mit Java EE 6 und CDI (JSR 299 aka WebBeans) hält nun ein Entwicklungsparadigma Einzug, das diesen Designansatz zugunsten des fachlichen Domain-Modells grundlegend verändern kann. "Business Injection" statt "Infrastructure Injection" ist das zugehörige Zauberwort. Die Session zeigt, wie eine klassische Mehrschichtwebanwendung durch die Einführung von fachlicher Dependency Injection, asynchroner bzw. eventorientierter Kommunikation und Ansätzen der aspektorientierten Programmierung verbessert werden kann und dabei mit standardisierten Mitteln ein neues Zeitalter der effizienten, wartbaren und performanten Anwendungsarchitektur einläutet.TRANSCRIPT
![Page 1: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/1.jpg)
No-Tier EnterpriseApplications with CDI
Lars Röwekamp | open knowledge
GmbH @mobileLarson
@_openknowledge
![Page 2: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/2.jpg)
> Cool! JavaEE bietet IoC/DI > Cool! JavaEE bietet IoC/DI > Cool! JavaEE bietet IoC/DI > Cool! JavaEE bietet IoC/DI
![Page 3: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/3.jpg)
> Aber was ändert > Aber was ändert sich?sich?
![Page 4: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/4.jpg)
> SCHICHT 3
> SCHICHT 2
> SCHICHT 1TX Grenze
![Page 5: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/5.jpg)
> UseCase: ausgewählten Kunden bearbeiten
Einmal den CustomerController, bitte ;-) Und für mich den
CustomerService, bitte!
Ok, dann brauch ich nen Customer mit der ID 147122, aber flott!
![Page 6: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/6.jpg)
AA KK TT UU EE LL LL
AA UU SS GG EE WW ÄÄ HH LL TT EE
KK UU NN DD EE
RR
> Was wäre wenn ...? > Was wäre wenn ...? > Was wäre wenn ...? > Was wäre wenn ...?
![Page 7: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/7.jpg)
LL II SS TT EE
MM EE II NN EE RR
EE II NN KK ÄÄ UU
> Oder wenn ...? > Oder wenn ...? > Oder wenn ...? > Oder wenn ...?
FF EE
![Page 8: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/8.jpg)
> „No-Tier“
TX Grenze
![Page 9: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/9.jpg)
J2EE 1.3 (JSR 58):
September 2001 Servlet 2.3 JSP 1.2 EJB 2.0
J2EE 1.4 (JSR 151):
November 2003 Servlet 2.4 JSP 2.0 EJB 2.1
01 / 02 03 / 04 05 / 06 07 / 08 09 / 10
Spring V1
Juni 2003
„Spring“
Oktober 2002
Java EE v5 (JSR 244):
Mai 2006 Servlet 2.5 JSP 2.1 / JSF 1.2 EJB 3.0
Java EE v6 (JSR 316):
Dezember 2009 Servlet 3.0 JSP 2.1 MR / JSF 2.0 EJB 3.1 JPA 2.0 CDI 1.0
Spring V3
Dezember 2009
Spring V2
Oktober 2006
![Page 10: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/10.jpg)
CDI Konzepte > DI/IoC lite „Java EE without EJB“
> DI/IoC advanced LiceCyle Management und Scoping
> DI/IoC eXtreme Typensicherheit und lose Koppelung
> DI/IoC openExtension-Mechanismus
![Page 11: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/11.jpg)
Teil 1: Base Features
![Page 12: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/12.jpg)
Teil 1: Base Features
> @Inject> @Named> Sterotypes> Alternatives
![Page 13: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/13.jpg)
Teil 1: Base Features
> Sope Singleton> Request> Conversation> Session> Application> Dependant*> Singleton*> Cleanup*Pseudo-Scope
![Page 14: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/14.jpg)
Teil 1: Base Features
![Page 15: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/15.jpg)
Teil 1: Base Features
> Events> Observer> Interceptors
![Page 16: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/16.jpg)
Teil 1: Base Features
> Qualifier> Stereotypes> Alternatives
![Page 17: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/17.jpg)
> Was haben wir > Was haben wir gewonnen?gewonnen?> Was haben wir > Was haben wir gewonnen?gewonnen?
![Page 18: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/18.jpg)
> SCHICHT 3
> SCHICHT 2
> SCHICHT 1
![Page 19: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/19.jpg)
> SCHICHT 3
> SCHICHT 2
> SCHICHT 1
![Page 20: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/20.jpg)
import javax.inject.Named;import javax.inject.Inject;import javax.enterprise.context.RequestScoped;
@Named(“hello“)@RequestScopedpublic class HelloBean {
@Inject Greeter greeter;
private String name;
public String getGreeting() {return greeter.greet(name);
}
// getter and setter for name attribute...}
CDI Managed Bean
„hello“ für EL„hello“ für EL
gültig für Requestgültig für Request
Injection PointInjection Point
![Page 21: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/21.jpg)
Cool, aber geht da
nicht mehr?
CDI Mehrwert
![Page 22: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/22.jpg)
FACHLICHE Injektion statt „nur“
Infrastruture Injection
![Page 23: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/23.jpg)
eCustomer - Beispiel
![Page 24: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/24.jpg)
![Page 25: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/25.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only
> CDI Style Views
> CDI Events
![Page 26: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/26.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only
> CDI Style Views
> CDI Events
![Page 27: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/27.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only
> CDI Style Views
> CDI Events
![Page 28: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/28.jpg)
eCustomer - CDI Current User
> Producer Methods & Fields
> „Factory Method“ Pattern für Objekte
> @Produces als Mittel zum Zweck
> @Qualifier als Mittel zur Qualifizierung
> Ermöglicht nicht nur Infrastruktur
sondern vor allem auch fachliche
Injection.
![Page 29: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/29.jpg)
eCustomer - CDI Current User
package de.openknowledge.qualifier;
import ...
@Qualifier@Target({TYPE, METHOD, PARAMETER, FIELD})@Retention(RUNTIME)public @interface Current{}
Self-made QualifierSelf-made Qualifier
![Page 30: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/30.jpg)
eCustomer - CDI Current User
@Named@SessionScopedpublic class AuthenticationController implements Serializable {
private User authenticatedUser; public String authenticate() {...}
@Produces @Current public User getAuthenticatedUser() {...}
...}
AuthenticationControllerAuthenticationController
@Inject @Current User user; @Inject @Current User user;
![Page 31: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/31.jpg)
Use Case „Kunde bearbeiten“
@Statelesspublic class CustomerServiceEJB
implements CustomerService {
@Inject @Current private User currentUser;
@PersistenceContext private EntityManager em;
// updates the customer - needs a transaction public Customer updateCustomer(Customer customer) { customer.updateAuditInformation(currentUser); return em.merge(customer); }}
CustomerService EJBCustomerService EJB
![Page 32: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/32.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only
> CDI Style Views
> CDI Events
![Page 33: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/33.jpg)
eCustomer - CDI Beans only
> Injizierbare CDI Ressourcen
> „normale“ Java Klassen, optional mit
@Named oder @Qualifier markiert
> EJBs, wie Stateless, Stateful, Singleton
> Sonstige Java EE Ressourcen, wie
PersistenceContext, UserTransaction
![Page 34: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/34.jpg)
eCustomer - CDI Beans only
@Stateless// no annotation required!public class CustomerServiceBeanEJB
implements CustomerService {
@PersistenceContext private EntityManager em;
// updates the customer - needs a transaction public Customer updateCustomer(Customer customer) { return em.merge(customer); }
...
}
CustomerService CDICustomerService CDI
![Page 35: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/35.jpg)
eCustomer - CDI Beans only
@Stateless// no annotation required!public class CustomerServiceBeanEJB
implements CustomerService {
@PersistenceContext private EntityManager em;
// updates the customer - needs a transaction public Customer updateCustomer(Customer customer) { return em.merge(customer); }
...
}
CustomerService CDICustomerService CDI
Und Transaktionen?!Und Transaktionen?!
Bauen wir uns selbst ...Bauen wir uns selbst ...
![Page 36: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/36.jpg)
eCustomer - CDI Beans only
// simple pojo // no annotation required!public class CustomerServiceBean
implements CustomerService {
@PersistenceContext private EntityManager em;
@Transactional public Customer updateCustomer(Customer customer) { return em.merge(customer); }
...
}
CustomerService CDICustomerService CDI
![Page 37: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/37.jpg)
CDI Interceptor
s
![Page 38: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/38.jpg)
eCustomer - CDI Beans only
@InterceptorBinding@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Transactional { public TransactionalType value()
default TransactionalType.REQUIRED; }
Transactional AnnotationTransactional Annotation
??
![Page 39: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/39.jpg)
eCustomer - CDI Beans only
@Transactional @Interceptorpublic class TransactionInterceptor {
@Inject private UserTransaction utx;
@AroundInvoke public Object applyTransaction( InvocationContext ic) throws Throwable {
... // implement utx.begin() ic.proceed(); // call original method ... // implement utx.commit()
} }
*XML registration omitted
Transactional Interceptor*Transactional Interceptor*
![Page 40: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/40.jpg)
eCustomer - CDI Beans only
// no annotation required!public class CustomerServiceBean
implements CustomerService {
@PersistenceContext private EntityManager em; @de.openknowledge.qualifier.Transactional public Customer updateCustomer(Customer customer) { return em.merge(customer); }
...
}
CustomerService CDICustomerService CDI
inkl. Transaktioninkl. Transaktion
![Page 41: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/41.jpg)
> SCHICHT 3
> SCHICHT 2
> SCHICHT 1TX Grenze
![Page 42: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/42.jpg)
> SCHICHT 3
> SCHICHT 2
> SCHICHT 1
TX Grenze
![Page 43: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/43.jpg)
eCustomer - CDI Beans only
@Named@SessionScopedpublic class CustomerBean implements Serializable {
@Inject private CustomerService customerService;
@de.openknowledge.qualifier.Transactional public String update() { customerService.updateCustomer(currentCustomer); return Outcome.SUCCESS; } ...}
CustomerBean CDICustomerBean CDI
inkl. „fachliche“ Transaktioninkl. „fachliche“ Transaktion
![Page 44: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/44.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only
> CDI Style Views
> CDI Events
![Page 45: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/45.jpg)
eCustomer - CDI Style Views
> CDI Conversations
> @ConversationScoped
> conversation.begin() / .end()
> CDI „Backing Beans“
> @Produces in Kombination mit @Named
> „self-made“ Qualifier
![Page 46: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/46.jpg)
eCustomer - CDI Style Formulare
@javax.inject.Named@javax.context.enterpise.ConversationScopedpublic class CustomerBean implements Serializable {
private Customer customer;
@javax.inject.Inject private Conversation conversation;
public String selectCustomer(Customer customer) { this.customer = customer; conversation.begin(); ... } ... }
CustomerBean (1/2)CustomerBean (1/2)
![Page 47: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/47.jpg)
eCustomer - CDI Style Formulare
@javax.inject.Named@javax.context.enterpise.ConversationScopedpublic class CustomerBean implements Serializable {
...
public String update() { conversation.end(); ... } ...
}
CustomerBean (2/2)CustomerBean (2/2)
endet mit aktuellen Requestendet mit aktuellen Request
![Page 48: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/48.jpg)
eCustomer - CDI Style Formulare
<html ...> <h:body> <h:form>
Vorname: <h:inputText value=“#{customerBean.customer.firstname}"/> Name: <h:inputText value=“#{customerBean.customer.lastname}"/>
</h:form> </h:body></html>
Infrastructure in der View!Infrastructure in der View!
![Page 49: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/49.jpg)
eCustomer - CDI Style Formulare
@javax.inject.Named@javax.context.enterpise.ConversationScopedpublic class CustomerBean implements Serializable {
private Customer customer;
@javax.inject.Produces @javax.inject.Named(“selectedCustomer“) @de.openknowledge.qualifier.Selected public Customer getSelected { return customer; } ... }
CustomerBean CustomerBean
![Page 50: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/50.jpg)
eCustomer - CDI Style Formulare
<html ...> <h:body> <h:form>
Vorname: <h:inputText value=“#{selectedCustomer.firstname}"/> Name: <h:inputText value=“#{selectedCustomer.lastname}"/>
</h:form> </h:body></html>
Fachlichkeit in der View!Fachlichkeit in der View!
![Page 51: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/51.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only
> CDI Style Views
> CDI Events
![Page 52: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/52.jpg)
eCustomer - CDI Events
> Java EE Observer Pattern, inkl. ...
> Event Object & Event Producer
> Observer Method
> „besondere“ Eigenschaften
> schichtenneutral auch für POJOs
> (ggf.) transaktionsgebunden
> synchrone Interaktion
![Page 53: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/53.jpg)
eCustomer - CDI Events
„User created!“„User created!“
„Und ich auch!“„Und ich auch!“„Ah, interessant.“„Ah, interessant.“
„Finde ich!“„Finde ich!“
![Page 54: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/54.jpg)
eCustomer - CDI Events
> Ok, aber ...
> Wie sieht ein solches Event aus?
> Und wie fange ich es?
> Und vor allem: wie löse ich es aus?
![Page 55: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/55.jpg)
eCustomer - CDI Events
public class CustomerCreatedEvent {
private Customer customer;
public CustomerCreatedEvent(Customer customer) { this.customer = customer; }
public Customer getCustomer() { ... }}
Customer Created Event (1/3)Customer Created Event (1/3)
„Wie sieht ein solches Event aus?“
![Page 56: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/56.jpg)
eCustomer - CDI Events
public void sendWelcomeMail( @Observes CustomerCreatedEvent event) { Customer customer = event.getCustomer(); ...}
Customer Created Event (2/3)Customer Created Event (2/3)
„Und wie fange ich es?“
![Page 57: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/57.jpg)
eCustomer - CDI Events
@Injectprivate Event<CustomerCreatedEvent> eventSource;
public String createCustomer() {
Customer customer = ...; eventSource.fire( new CustomerCreatedEvent(customer) ); ... }
Customer Created Event (3/3)Customer Created Event (3/3)
„Und vor allem: Wie löse ich es aus?“
![Page 58: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/58.jpg)
eCustomer - CDI Events
public void sendWelcomeMail( @Observes CustomerCreatedEvent event @Created Customer customer) { Customer customer = event.getCustomer(); ...}
Qualified CDI Event (2/3)Qualified CDI Event (2/3)
„Und wie fange ich es?“
![Page 59: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/59.jpg)
eCustomer - CDI Events
@Inject @Created private Event<Customer> eventSource;
public String createCustomer() { Customer customer = ...; eventSource.fire(customer); ... }
Qualified CDI Event (3/3)Qualified CDI Event (3/3)
„Und vor allem: Wie löse ich es aus?“
![Page 60: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/60.jpg)
eCustomer - CDI Events
„Wow! Observer mit Qulifiern - das muss ich erst einmal sacken lassen!“
„Und das ist erst die Spitze des Eisberges - schau dir
mal die CONDITIONAL OBSERVER METHODS hier
an!“
![Page 61: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/61.jpg)
eCustomer - CDI Events
// Conditional Observer Method that takes // - Transaction status, e.g. AFTER_SUCCESS, // AFTER_FAILURE// - Bean instance status, e.g. ALLWAYS// into accountpublic void sendWelcomeMail( @Observes( receive=ALLWAYS, // bean during=AFTER_SUCCESS // tx ) @Created Customer customer) { ... }
Conditional Observer MethodsConditional Observer Methods
![Page 62: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/62.jpg)
> „No-Tier“
TX Grenze
![Page 63: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/63.jpg)
XFazit:
![Page 64: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/64.jpg)
CDI Fazit
CDI ermöglicht ...
“Java Enterprise Development without EJB - and without Spring“
CDI bietet dafür ...
„typesafe und schichtenneutrales Injection Framework für fachliche und technische Injection sowie ein Rahmenwerk für eventgetriebene Entwicklung.“
![Page 65: No-Tier Enterprise Application mit CDI](https://reader034.vdocuments.us/reader034/viewer/2022052620/5579a536d8b42ac1148b4a49/html5/thumbnails/65.jpg)
Gibt es noch Fragen?
Dann los ...
@mobileLarson@_openknowledg
efacebook.com/openknowledge