Java EE Development without EJB - and without Spring - Part 2

Post on 24-Jun-2015

1,412 views 3 download

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.

transcript

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 ...