Upload
open-knowledge-gmbh
View
1.413
Download
3
Embed Size (px)
DESCRIPTION
Die grundlegenden Bausteine von CDI lassen nur ungefähr erahnen, welche enormen Chancen und Möglichkeiten diese Technologie für die Umsetzung von Java-EE-Anwendungen bietet. Der zweite Teil der Doppelsession widmet sich daher dem CDI-Programmiermodell und erläutert anhand eines praktischen Beispiels die Umsetzung von CDI-Anwendungen in Abgrenzung zu herkömmlichen Ansätzen. Dabei kommen Best Practices und Pattern sowie die sogenannten „portablen Erweiterungsmöglichkeiten“ nicht zu kurz.
Citation preview
In den nächsten 60 Minuten
Refactoring !the Java EE CDI way!
eCustomer Beispiel
§ Java EE Anwendung zur Online-Verwaltung von Kunden
§ View: Login Screen, Übersicht der Kunden, Kunde anlegen, Kunde bearbeiten, Kunde löschen
§ Model: User (Admin), Kunde
Demo time...!
§ Architekturansatz § Mehrschicht-
architektur
§ Bausteine § JSF xhtml Seiten
§ Formularobjekte
§ Services
§ Persistente Domain Objekte (User,...)
eCustomer Beispiel
§ *.xhtml § AuthenticationBean
§ CustomerBean
§ CustomerService(EJB)
§ Customer
Use Case Kunde bearbeiten
Use Case Kunde bearbeiten
§ JSF AuthenticationBean
@ManagedBean!@SessionScoped!public class AuthenticationBean! implements Serializable {!! private User authenticatedUser;! ! public String authenticate() {...}!! public User getAuthenticatedUser() {...}!}!!
Use Case Kunde bearbeiten
§ View customer/edit.xhtml
<html ...><h:body>! <h:form>!! Vorname: <h:inputText ! value=“#{customerBean.firstname}"/>! Name: <h:inputText ! value=“#{customerBean.name}"/> ! !! </h:form>!</h:body></html>!!! !!
Use Case Kunde bearbeiten
§ JSF CustomerBean Attribute (1/3)
@ManagedBean @SessionScoped!public class CustomerBean implements Serializable {! private Customer currentCustomer;! ! public String getFirstname() {! return currentCustomer.getFirstname();! }! public void setFirstname(String firstname) {! currentCustomer.setFirstname(firstname);! }! public String getName() {...}! public void setName(String name) {...}!}!
Use Case Kunde bearbeiten
§ JSF CustomerBean Audit Info (2/3)
@ManagedBean @SessionScoped!public class CustomerBean implements Serializable {!! @ManagedProperty("#{auth..Bean.authenticatedUser}")! private User currentUser;!!! public void setCurrentUser(User currentUser) {! this.currentUser = currentUser;! }!}!
Audit Info
Use Case Kunde bearbeiten
§ JSF CustomerBean Update (3/3)
@ManagedBean @SessionScoped!public class CustomerBean implements Serializable {! @EJB! private CustomerService customerService;!! public String update() {! currentCustomer.! updateAuditInformation(currentUser);! ! customerService.updateCustomer(currentCustomer);! return Outcome.SUCCESS;! }!}!
Audit Info
Use Case Kunde bearbeiten
§ CustomerService EJB
@Stateless!public class CustomerServiceEJB !
! !implements CustomerService {! ! @PersistenceContext! private EntityManager em;!! public Customer updateCustomer(Customer customer) {! return em.merge(customer);! }!}!! !!
CDI Optimierungspotential!?
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
eCustomer – CDI Wiring
§ JSR 330 Annotationen § @Named (für EL), @Qualifier
§ @Inject
§ JSR 299 Annotationen § @RequestScoped, @SessionScoped,
@ApplicationScoped, ...
eCustomer – CDI Wiring
§ JSF AuthenticationBean
@Named!@SessionScoped!public class AuthenticationBean! implements Serializable {!! ...!!}!!
eCustomer – CDI Wiring
§ JSF CustomerBean
@Named !@SessionScoped!public class CustomerBean implements Serializable {! ! @Inject // no EL support in @Named! private AuthenticationBean authBean;!! @Inject! private CustomerService customerService;!!}!
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
§ Producer Methods/Fields § Factory Method Pattern für fachliche
Objekte § @Produces
§ Qualifizierung über eigene fachliche Qualifier
eCustomer – CDI Current User
§ Current Qualifier
@Qualifier!@Target({TYPE, METHOD, PARAMETER, FIELD})!@Retention(RUNTIME)!public @interface Current{}!!!!!
eCustomer – CDI Current User
eCustomer – CDI Current User
§ JSF AuthenticationBean
@Named @SessionScoped!public class AuthenticationBean! implements Serializable {!! private User authenticatedUser;! ! public String authenticate() {...}!! @Produces! @Current! public User getAuthenticatedUser() {...}!}!!
eCustomer – CDI Current User
§ JSF CustomerBean
@Named @SessionScoped!public class CustomerBean implements Serializable {!! //@Inject // no EL support in @Named! //private AuthenticationBean authBean;!! public String update() {! // current.updateAuditInformation(! // authController.getAuthenticatedUser());! ! ...! }!}!
eCustomer – CDI Current User
§ CustomerService EJB
@Stateless!public class CustomerServiceEJB !
! !implements CustomerService {! @Inject ! @Current! private User currentUser;! ! public Customer updateCustomer(Customer customer) {! customer.updateAuditInformation(currentUser);! return em.merge(customer);! }!}!! !!
Alternativ: JPA Event
Listener
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
§ Injizierbare CDI Ressourcen § Normale Java Klassen
§ Optional mit @Named oder anderen Qualifier markiert
§ Enterprise Java Beans
§ Sonstige Java EE Ressourcen § PersistenceContext
§ UserTransaction § ...
eCustomer – CDI Beans only
eCustomer – CDI Beans only
§ CDI CustomerService
// nothing required!public class CustomerServiceBean !
! !implements CustomerService {! ! @PersistenceContext! private EntityManager em;!! public Customer updateCustomer(Customer customer) {! return em.merge(customer);! }!}!! !!
eCustomer – CDI Beans only
§ CDI CustomerService
// nothing required!public class CustomerServiceBean !
! !implements CustomerService {! ! @PersistenceContext! private EntityManager em;!! public Customer updateCustomer(Customer customer) {! return em.merge(customer);! }!}!! !!
Transaktionen?!
§ Transactional Annotation
@InterceptorBinding!@Retention(RetentionPolicy.RUNTIME)!@Target({ElementType.METHOD, ElementType.TYPE})!!public @interface Transactional {! ! public TransactionalType value() !
!default TransactionalType.REQUIRED;! !}!
eCustomer – CDI Beans only
§ Transaction Interceptor*
@Transactional @Interceptor!public class TransactionInterceptor {!! @Inject! private UserTransaction utx;!! @AroundInvoke! public Object applyTransaction(!
! !InvocationContext ic) throws Throwable {!! // implement utx.begin(), utx.commit(), ...! } !}!
*XML registration omitted
eCustomer – CDI Beans only
eCustomer – CDI Beans only
§ Transactional CDI CustomerService
!public class CustomerServiceBean !
! !implements CustomerService {! ! @PersistenceContext! private EntityManager em;!! @Transactional ! public Customer updateCustomer(Customer customer) {! ...! }!}!! !!
eCustomer – CDI Beans only
§ Transactional JSF CustomerBean
@Named @SessionScoped!public class CustomerBean implements Serializable {!! @Inject! private CustomerService customerService;!!! @Transactional! public String update() {! ...! }!}!
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
CDI Style Formulare
Und was hat CDI für die !Formularbehandlung im Angebot?!
CDI Style Formulare
§ CDI Conversations § @ConversationScoped
§ Conversation.begin()
§ Conversation.end()
§ JSF Backing Beans und Producer Methods § @Produces @Named
§ Qualifier
CDI Style Formulare
§ CustomerBean Conversation (1/2)
@Named @ConversationScoped!public class CustomerBean implements Serializable {! private Customer currentCustomer;! @Inject ! private Conversation conversation; !! public String selectCustomer(Customer customer) {! currentCustomer = customer;! conversation.begin();! ... ! }!}!
CDI Style Formulare
§ CustomerBean Conversation (2/2)
@Named @ConversationScoped!public class CustomerBean implements Serializable {!! public String update() {! conversation.end(); ! ...! }!}!
CDI Style Formulare
§ Achtung: Infrastruktur Teil des View
<html ...><h:body>! <h:form>! ! Vorname: <h:inputText ! value=“#{customerBean.firstname}"/>! Name: <h:inputText ! value=“#{customerBean.name}"/> ! ! </h:form>!</h:body></html>!!! !!
Infrastruktur!
CDI Style Formulare
§ JSF und Producer Methods
@Named @ConversationScoped!public class CustomerBean implements Serializable {! private Customer currentCustomer;!! public String selectCustomer(Customer customer) {! ... ! }!! @Produces ! @Named(“selectedCustomer“)! @Selected! public Customer getSelected() { ... } !}!
CDI Style Formulare
§ JSF und Producer Methods
<html ...><h:body>! <h:form>! ! Vorname: <h:inputText ! value=“#{selectedCustomer.firstname}"/>! Name: <h:inputText ! value=“#{selectedCustomer.name}"/> ! !! </h:form>!</h:body></html>!!! !!
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
CDI Events
§ CDI Eventsystem § Java EE Observer Pattern
§ Event Object
§ Event Producer § Observer Method
§ Eigenschaften § Schichtenübergreifend § (Ggfs.) Transaktionsgebunden
§ Synchrone Interaktion
CDI Events
§ CDI Customer Created Event (1/3)
public class CustomerCreatedEvent {!! private Customer customer;!! public CustomerCreatedEvent(Customer customer) {...}!! public Customer getCustomer() { ... }!}!! !
CDI Events
§ CDI Customer Created Event (2/3)
public void sendWelcomeMail(! @Observes ! CustomerCreatedEvent event) { ! ! Customer customer = event.getCustomer();!!}!!
CDI Events
§ CDI Customer Created Event (3/3)
@Inject! private Event<CustomerCreatedEvent> eventSource;!! public String createCustomer() {! Customer customer = ...;! ! eventSource.fire(! new CustomerCreatedEvent(customer)! );! ! ...! }!
CDI Events
Ist das Event Objekt wirklich notwendig?!
CDI Events
§ Qualified CDI Events (1/3)
@Qualifier!@Target({TYPE, METHOD, PARAMETER, FIELD})!@Retention(RUNTIME)!public @interface Created{}!!!!!! !
CDI Events
§ Qualified CDI Events (2/3)
public void sendWelcomeMail(! @Observes ! @Created ! Customer customer) { ! ! ...!}!!
CDI Events
§ Qualified CDI Events (3/3)
@Inject! private Event<Customer> eventSource;!! public String createCustomer() {! Customer customer = ...;! ! eventSource! .select(new AnnotationLiteral<Created>(){})! .fire(customer);! ! ...! }!
§ Conditional Observer Methods § Berücksichtigung von Transaktionen
(AFTER_SUCCESS, AFTER_FAILURE,...) und Bean Instanz Status (EXISTS,...)
public void sendWelcomeMail(! @Observes( ! receive=IF_EXISTS, // bean ! during=BEFORE_COMPETION // tx ! ) ! @Created ! Customer customer) { ... }!
CDI Events
CDI Refactoring
§ 1 - CDI Wiring
§ 2 - CDI Current User
§ 3 - CDI Beans only
§ 4 - CDI Style Formulare
§ 5 - CDI Events
§ 6 - CDI Ausblick
CDI Ausblick
§ CDI 1.1 § Declarative Transaktionen
§ Embedded Mode
§ Interceptor/Decorator Ordering
§ Static Injection
§ Spec Cleanup
§ ... § Aufbau CDI Community
§ CDI Advocacy*
*https://sites.google.com/site/cdipojo/get-started
Java EE without EJB/Spring
Extensions Fazit
Java EE without EJB/Spring
§ „Java SE Injection“
§ Scope System
§ Fachliche Dependency Injection
§ Infrastruktur und Businesslogik AOP
§ Eventmodell
§ Integrationsframework
Java EE without EJB/Spring
§ 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 Rahmenwerk für eventgetriebene Entwicklung“
Gibt es noch Fragen?
Dann los ...