No Tier Enterprise Applications with CDI
-
Upload
open-knowledge-gmbh -
Category
Technology
-
view
684 -
download
1
description
Transcript of No Tier Enterprise Applications with CDI
![Page 1: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/1.jpg)
No-Tier EnterpriseApplications with CDI
Lars Röwekamp | open knowledge GmbH
@mobileLarson@_openknowledge
![Page 2: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/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 Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/3.jpg)
> Aber was ändert sich?> Aber was ändert sich?
![Page 4: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/4.jpg)
> SCHICHT 2
> SCHICHT 1TX Grenze
> SCHICHT 3
> SCHICHT 2
![Page 5: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/5.jpg)
Einmal den Customer Controller, bitte ;-)
Und für mich den Customer Service, bitte!
Ok, dann brauch ich nen Customer Entity mit der internene ID 147122, aber flott!
> UseCase: ausgewählten Kunden bearbeiten
![Page 6: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/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 ...?
KK UU NN DD EE
![Page 7: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/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 EEEE II NN KK ÄÄ UU FF EE
![Page 8: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/8.jpg)
> „No-Tier“
TX Grenze
> „No-Tier“
![Page 9: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/9.jpg)
J2EE 1.3 (JSR 58):
September 2001
� Servlet 2.3
� JSP 1.2
� EJB 2.0
01 / 02 03 / 04 05 / 06 07 / 08 09 / 10
Spring V1
Juni 2003
Java EE v5 (JSR 244):
Mai 2006
� Servlet 2.5
� JSP 2.1 / JSF 1.2
� EJB 3.0
Spring V3
Dezember 2009
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“
Oktober 2002
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 V2
Oktober 2006
![Page 10: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/10.jpg)
Enterprise JavaBeans
Life Cycle Mmgt.
Instance Pooling
Concurrency
TransactionTransaction
Security
Scoping
...
EJBs: Schwergewichtig
![Page 11: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/11.jpg)
CDI:
Leichtegichtig CDI Beans
Life Cycle Mmgt.
Scoping
... AND ...
*** Extensibility ***
![Page 12: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/12.jpg)
CDI Konzepte
Typensicher DI
(Stereotypes, Qulifier)
Loose Koopelung
CDI:
Leichtegichtig
(Events, Interceptors)
Sichtbarkeiten
(Sopes, LifeCycle )
„FACHLICHE INJECTION“
![Page 13: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/13.jpg)
> DI/IoC lite„Java EE without EJB“
> DI/IoC advancedLifeCyle Managementund Scoping
CDI Kickstart
> DI/IoC eXtremeTypensicherheit undlose Koppelung
> DI/IoC openExtension-Mechanismus
![Page 14: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/14.jpg)
Base Features
![Page 15: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/15.jpg)
Base Features
> @Inject> @Named> Sterotypes> Sterotypes> Alternatives
![Page 16: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/16.jpg)
Base Features
> Sope Singleton> Cleanup> Request> Conversation> Conversation> Session> Application> Dependant*> Singleton*
*Pseudo-Scope
![Page 17: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/17.jpg)
Base Features
![Page 18: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/18.jpg)
Base Features
![Page 19: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/19.jpg)
Base Features
> Events> Events> Observer> Interceptors
![Page 20: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/20.jpg)
Base Features
> Qualifier> Stereotypes> Alternatives
![Page 21: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/21.jpg)
> Was haben wir gewonnen?> Was haben wir gewonnen?> Was haben wir gewonnen?> Was haben wir gewonnen?
![Page 22: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/22.jpg)
> SCHICHT 2
> SCHICHT 1
> SCHICHT 3
> SCHICHT 2
![Page 23: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/23.jpg)
> SCHICHT 2
> SCHICHT 1
> SCHICHT 3
> SCHICHT 2
![Page 24: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/24.jpg)
import javax.inject.Named;import javax.inject.Inject;import javax.enterprise.context.RequestScoped;
@Named(“hello “)@RequestScopedpublic class HelloBean {
CDI Managed Bean
„hello“ für EL„hello“ für EL
gültig für Requestgültig für Requestpublic class HelloBean {
@Inject Greeter greeter ;
private String name;
public String getGreeting() {return greeter .greet( name);
}
// getter and setter for name attribute...}
Injection PointInjection Point
![Page 25: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/25.jpg)
public class Greeter {
public String greet(Sting name) {
if ( name != null) {return “Hello, “ + name;
CDI Managed BeanSimple POJOSimple POJO
return “Hello, “ + name; } else {
return “Hello, stranger!“; }
}}
![Page 26: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/26.jpg)
CDI Managed Bean
@Statelesspublic class GreeterEJB
implements Greeter {
private static final Log logger = ...
@Inject @Current CrmUser crmUser;
Stateless EJBStateless EJB
@Inject @Current CrmUser crmUser;
public String greet(Sting name) {
logger. debug(“Who: “ + crmUser.getName());
if ( name != null) {... // create & return greeting
}}}
![Page 27: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/27.jpg)
Cool, aber geht da
nicht mehr?
CDIMehrwert
![Page 28: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/28.jpg)
FACHLICHE Injektion statt „nur“
Infrastruture Injection
![Page 29: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/29.jpg)
eCustomer - Beispiel
![Page 30: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/30.jpg)
![Page 31: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/31.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only> CDI Beans only
> CDI Style Views
> CDI Events
![Page 32: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/32.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only> CDI Beans only
> CDI Style Views
> CDI Events
![Page 33: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/33.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only> CDI Beans only
> CDI Style Views
> CDI Events
![Page 34: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/34.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 35: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/35.jpg)
eCustomer - CDI Current User
@Named@SessionScopedpublic class AuthenticationController
implements Serializable {
private User authenticatedUser;
AuthenticationControllerAuthenticationController
public String authenticate() {...}
public User getAuthenticatedUser() {...}
...}
@Produces @Current
![Page 36: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/36.jpg)
eCustomer - CDI Current User
@Named@SessionScopedpublic class AuthenticationController
implements Serializable {
private User authenticatedUser;
public String authenticate() {...}
@Produces@Currentpublic User getAuthenticatedUser() {...}
...} @Inject @Current User user; @Inject @Current User user;
@RequestScoped
![Page 37: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/37.jpg)
eCustomer - CDI Current User
package de.openknowledge.qualifier;
import ...
@Qualifier@Target({TYPE, METHOD, PARAMETER, FIELD})@Retention(RUNTIME)
Self-made QualifierSelf-made Qualifier
@Retention(RUNTIME)public @interface Current {}
![Page 38: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/38.jpg)
eCustomer - CDI Current User
@javax.inject. [email protected]. SessionScopedpublic class CustomerBean implements Serializable {
// @javax.inject. Inject // private AuthenticationController authController ;
JSF CustomerBean JSF CustomerBean
@javax.inject. Injectprivate CustomerService customerService ;
public String update () {// User currentUser =
authController .getAuthenticatedUser();// currentCustomer .updateAuditInformation(currentUser);
customerService .updateCustomer(currentCustomer);return Outcome.SUCCESS;
}...
}
Audit „Bereinigung“Audit „Bereinigung“
![Page 39: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/39.jpg)
Use Case „Kunde bearbeiten“
@Statelesspublic class CustomerServiceEJB
implements CustomerService {
@Inject @Currentprivate User currentUser;
CustomerService EJBCustomerService EJB
@PersistenceContextprivate EntityManager em;
// updates the customer - needs a transactionpublic Customer updateCustomer(Customer customer)
{customer.updateAuditInformation(currentUser);return em.merge(customer);
}}
![Page 40: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/40.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only> CDI Beans only
> CDI Style Views
> CDI Events
![Page 41: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/41.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 42: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/42.jpg)
eCustomer - CDI Beans only
@Stateless// no annotation required!public class CustomerService BeanEJB
implements CustomerService {
@Inject @Currentprivate User currentUser;
CustomerService CDICustomerService CDI
private User currentUser;
@PersistenceContextprivate EntityManager em;
// updates the customer - needs a transactionpublic Customer updateCustomer(Customer customer)
{customer.updateAuditInformation(currentUser);return em.merge(customer);
}
...
}
![Page 43: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/43.jpg)
eCustomer - CDI Beans only
@Stateless// no annotation required!public class CustomerService BeanEJB
implements CustomerService {
@Inject @Currentprivate User currentUser;
CustomerService CDICustomerService CDI
private User currentUser;
@PersistenceContextprivate EntityManager em;
// updates the customer - needs a transactionpublic Customer updateCustomer(Customer customer)
{customer.updateAuditInformation(currentUser);return em.merge(customer);
}
...
}
Und Transaktionen?!Und Transaktionen?!
Bauen wir uns selbst ...Bauen wir uns selbst ...
![Page 44: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/44.jpg)
eCustomer - CDI Beans only
// simple pojo // no annotation required!public class CustomerServicBean
implements CustomerService {
@Inject @Currentprivate User currentUser;
CustomerService CDICustomerService CDI
private User currentUser;
@PersistenceContextprivate EntityManager em;
@Transactionalpublic Customer updateCustomer(Customer customer)
{customer.updateAuditInformation(currentUser);return em.merge(customer);
}
...
}
![Page 45: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/45.jpg)
CDI Interceptors
![Page 46: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/46.jpg)
eCustomer - CDI Beans only
@InterceptorBinding@Retention(RetentionPolicy.RUNTIME)@Target({ElementType.METHOD, ElementType.TYPE})
public @interface Transactional {
@Nonbinding
??@Nonbindingpublic TransactionalType value ()
default TransactionalType.REQUIRED;
}
Transactional AnnotationTransactional Annotation
![Page 47: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/47.jpg)
eCustomer - CDI Beans only
@Transactional @Interceptorpublic class TransactionAdvice {
@Injectprivate UserTransaction utx;
Transactional Interceptor*Transactional Interceptor*
@AroundInvokepublic Object applyTransaction(
InvocationContext ic ) throws Throwable {
... // 1. access @Transactional,// if needed
... // 2. implement utx.begin()ic.proceed(); // 3. call original method... // 4. implement utx.commit()
} } *XML registration omitted
![Page 48: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/48.jpg)
eCustomer - CDI Beans only
@Transactional @Interceptorpublic class TransactionAdvice {
@Injectprivate UserTransaction utx;
Transactional Interceptor*Transactional Interceptor*
@AroundInvokepublic Object applyTransaction(
InvocationContext ic ) throws Throwable {
Transactional tx = ic.getMethod(). getAnnotation(Transactional.class);
... // 2. implement utx.begin()ic.proceed(); // 3. call original method... // 4. implement utx.commit()
} } *XML registration omitted
![Page 49: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/49.jpg)
eCustomer - CDI Beans only
// no annotation required!public class CustomerServiceBean
implements CustomerService {
@Inject @Currentprivate User currentUser;
CustomerService CDICustomerService CDI
@PersistenceContextprivate EntityManager em;
@de.openknowledge.qualifier. Transactionalpublic Customer updateCustomer(Customer customer)
{customer.updateAuditInformation(currentUser);return em.merge(customer);
}...
}
inkl. Transaktioninkl. Transaktion
![Page 50: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/50.jpg)
> SCHICHT 2
> SCHICHT 1TX Grenze
> SCHICHT 3
> SCHICHT 2
![Page 51: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/51.jpg)
> SCHICHT 2
> SCHICHT 1
TX Grenze
> SCHICHT 3
> SCHICHT 2
![Page 52: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/52.jpg)
eCustomer - CDI Beans only
@Named@SessionScopedpublic class CustomerBean implements Serializable {
@Injectprivate CustomerService customerService ;
CustomerBean CDICustomerBean CDI
@de.openknowledge.qualifier. Transactionalpublic String update () {
customerService .updateCustomer(currentCustomer);... // some additional use case “tx“ related
workreturn Outcome.SUCCESS;
}...
}
inkl. „fachliche“ Transaktioninkl. „fachliche“ Transaktion
![Page 53: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/53.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only> CDI Beans only
> CDI Style Views
> CDI Events
![Page 54: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/54.jpg)
eCustomer - CDI Style Views
> CDI Conversations
> @ConversationScoped
> conversation.begin() / .end()
> CDI „Backing Beans“
> @Produces in Kombination mit @Named
> „self-made“ Qualifier
![Page 55: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/55.jpg)
eCustomer - CDI Style Views
@javax.inject. [email protected]. ConversationScopedpublic class CustomerBean implements Serializable {
private Customer customer;
@javax.inject .Inject
CustomerBean (1/2)CustomerBean (1/2)
@javax.inject .Inject private Conversation conversation ;
public String selectCustomer (Customer customer) {conversation.begin();this.customer = customer;return ... ;
}...
}
![Page 56: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/56.jpg)
eCustomer - CDI Style Views
@javax.inject. [email protected]. ConversationScopedpublic class CustomerBean implements Serializable {
private Customer customer;
@javax.inject .Inject
CustomerBean (2/2)CustomerBean (2/2)
@javax.inject .Inject private Conversation conversation ;
public String updateCustomer () {...conversation.end(); return ... ;
}...
}
Conversation endet mit RequestConversation endet mit Request
![Page 57: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/57.jpg)
eCustomer - CDI Style Views
<html ...><h:body>
<h:form>
Vorname: <h:inputText value=“ #{ customerBean .customer.firstname} "/>
Name: <h:inputText
Infrastructure in der View!Infrastructure in der View!
Name: <h:inputText value=“ #{ customerBean .customer.lastname} "/>
</h:form></h:body>
</html>
![Page 58: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/58.jpg)
eCustomer - CDI Style Views
<html ...><h:body>
<h:form>
Vorname: <h:inputText value=“ #{ selectedCustomer .firstname} "/>
Name: <h:inputText
Fachlichkeit in der View!Fachlichkeit in der View!
Name: <h:inputText value=“ #{ selectedCustomer .lastname} "/>
</h:form></h:body>
</html>
![Page 59: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/59.jpg)
eCustomer - CDI Style Views
@javax.inject. [email protected]. ConversationScopedpublic class CustomerBean implements Serializable {
private Customer customer ;
@javax.inject. Produces
CustomerBean CustomerBean
@javax.inject. [email protected]. Named(“ selectedCustomer “)@de.openknowledge.qualifier. Selectedpublic Customer getSelected {
return customer ; }...
}
![Page 60: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/60.jpg)
CDI Refactoring
> CDI Wiring
> CDI Current User
> CDI Beans only> CDI Beans only
> CDI Style Views
> CDI Events
![Page 61: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/61.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 62: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/62.jpg)
eCustomer - CDI Events
„User created!“„User created!“
„Und ich auch!“„Und ich auch!“„Ah, interessant.“„Ah, interessant.“
„Finde ich!“„Finde ich!“
![Page 63: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/63.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 64: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/64.jpg)
eCustomer - CDI Events
public class CustomerCreatedEvent {
private Customer customer;
public CustomerCreatedEvent (Customer customer) {
Customer Created Event (1/3)Customer Created Event (1/3)
public CustomerCreatedEvent (Customer customer) {this.customer = customer;
}
public Customer getCustomer() { ... }}
„Wie sieht ein solches Event aus?“
![Page 65: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/65.jpg)
eCustomer - CDI Events
public void sendWelcomeMail(@Observes CustomerCreatedEvent event ) {
Customer customer = event.getCustomer () ;
Customer Created Event (2/3)Customer Created Event (2/3)
Customer customer = event.getCustomer () ;...
}
„Und wie fange ich es?“
![Page 66: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/66.jpg)
eCustomer - CDI Events
@Injectprivate Event<CustomerCreatedEvent> eventSource ;
public String createCustomer() {
Customer Created Event (3/3)Customer Created Event (3/3)
Customer customer = ...;
eventSource.fire (new CustomerCreatedEvent( customer )
) ;
...}
„Und vor allem: Wie löse ich es aus?“
![Page 67: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/67.jpg)
eCustomer - CDI Events
„Wird das Event Object tatsächlich benötigt oder gibt es eventuell noch Alternativen?“
„Nicht unbedingt, man kann auch sehr gut mit eigenen
Qualifiern arbeiten!“
![Page 68: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/68.jpg)
eCustomer - CDI Events
@Qualifier@Target({TYPE, METHOD, PARAMETER, FIELD})@Retention(RUNTIME)public @interface Created {}
Qualified CDI Event (1/3)Qualified CDI Event (1/3)
![Page 69: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/69.jpg)
eCustomer - CDI Events
public void sendWelcomeMail(@Observes CustomerCreatedEvent event@CreatedCustomer customer ) {
Qualified CDI Event - Alternative (2/3)Qualified CDI Event - Alternative (2/3)
Customer customer ) {
Customer customer = event.getCustomer();...
}
„Und wie fange ich es?“
![Page 70: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/70.jpg)
eCustomer - CDI Events
@Inject @Createdprivate Event<Customer> eventSource;
public String createCustomer() {
Qualified CDI Event - Alternative (3/3)Qualified CDI Event - Alternative (3/3)
Customer customer = ...; eventSource.fire(customer);
...}
„Und vor allem: Wie löse ich es aus?“
![Page 71: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/71.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 72: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/72.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(
Conditional Observer MethodsConditional Observer Methods
public void sendWelcomeMail(@Observes(
receive=ALLWAYS, // beanduring=AFTER_SUCCESS // tx
)@Created Customer customer) {
... }
![Page 73: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/73.jpg)
> „No-Tier“
TX Grenze
> „No-Tier“
![Page 74: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/74.jpg)
XFazit:
![Page 75: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/75.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 76: No Tier Enterprise Applications with CDI](https://reader034.fdocuments.us/reader034/viewer/2022051819/54c41e8b4a7959e8508b45ae/html5/thumbnails/76.jpg)
@mobileLarson@_openknowledge
facebook.com/openknowledge
Gibt es noch Fragen?
Dann los ...