Date post: | 24-Jun-2015 |
Category: |
Technology |
Upload: | open-knowledge-gmbh |
View: | 1,412 times |
Download: | 3 times |
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 ...