JSF & CDI - Dreamteam @Work

Post on 26-Jun-2015

655 views 1 download

Tags:

transcript

JSF & CDI: Dreamteam @WorkLars Röwekamp |  CIO New

Technologies

@mobileLarson@_openknowledge

Der „Klassiker“

TX

Java EE Web Framework

Java EE Service Framework

Java EE Persistence Framework

Der „Klassiker“

Wo liegt das Problem?

Heterogene Lösungen

eigene DI, Validierung, LifeCycle

Der „Klassiker“

eigene DI, Validierung, LifeCycle

eigene DI, Validierung, LifeCycle

Technology drivesBusiness

Der „Klassiker“

TX

Einen JSF ManagedBean

Controller, bitte.

Einen JSF ManagedBean

Controller, bitte.

Und für mich einen EJB Service.

Und für mich einen EJB Service.

Enitity X mit ID Y,wenn möglich.

Enitity X mit ID Y,wenn möglich.

UC: „Current User“ anzeigenUC: „Current User“ anzeigen

Der „Klassiker“

String basiertes IoCString basiertes IoC

Infrastrutur InjectionInfrastrutur Injection

String basierte NaviString basierte Navi

Technology InjectionTechnology Injection

Der „Klassiker“

Monster UseCaseMonster UseCase

String basierte Navi

Der „Klassiker“

Session statt „Conversation“

Session statt „Conversation“

Scope MismatchScope Mismatch

String basierte Navi

Der „Klassiker“ revisted

Der „Klassiker“ revisted

CDI 1.0 ...aus 10.000 m

CDI Kickstart

> DI / IoC lite „Java EE without EJB“

> DI / IoC advanced LifeCycle Management

und Scoping

> DI / IoC eXtreme Typensicherheit und lose Koppelung

> DI / IoC open Extension-Mechanismus

CDI Features

CDI Kickstart> LifeCycle Management & Scoping

> Scope sensitive Injection> Automatisches Cleanup

> Built-in Scopes> Request, Conversation, Session, Application

> Built-in Pseudo Scopes> Dependant, Singleton

> KEIN Proxy und Default!

CDI Kickstart> Typesafe Injection

> @Inject und #{...} via Type und Name > @Qualifer als zusätzliche Metadaten> @Inject @Current User loggedInUser

> @Stereotype als „Meta Annotation“> @Model entspricht @Named @RequestScoped

> @Alternative als „Switch“

CDI Kickstart

Aufruf: @Inject @Current UserAufruf: @Inject @Current User

@Produces @Current User@Produces @Current User

@Produces @Current @RequestScoped @Named(“loggedInUser“)

Aufruf: #{loggedInUser}Aufruf: #{loggedInUser}

CDI KickstartSelf-made Qualifier Self-made Qualifier

> Interceptors > Realisierung orthogonaler Aufgaben („AOP“)> Around Advice unterbricht normalen Ablauf> Caching, Security, Transactions, Performance

> Events & Observer> CDI erlaubt Injection einer Event Source> Event Source „feuert“ eigenes Event> Observer „hört“ auf Event

CDI Kickstart> Lose Koppelung

JSF & CDI: Dreamteam @Work

Refactoring - Step 1

Der „Klassiker“

String basiertes IoCString basiertes IoC

Infrastrutur InjectionInfrastrutur Injection

Scope MismatchScope Mismatch

String basierte NaviString basierte Navi

Technology InjectionTechnology Injection

> via @Inject „technologieneutrale“ Injection> via @Qualifier und „Type“ typesafe Injection> via @Named Zugriff aus EL

CDI @Work> Refactoring - Step 1: CDI only

Der „Klassiker“ refactored

String basierte Navi

Scope MismatchScope Mismatch

JSF & CDI: Dreamteam @Work

Refactoring - Step 2

Der „Klassiker“Infrastruktur Injection in der

ViewInfrastruktur Injection in der

View

> via @Named und @Produces Zugriff aus EL

CDI @Work> Refactoring - Step 2: View

Der „Klassiker“ refactored

Der „Klassiker“ refactored

fachliche Injection in der View

fachliche Injection in der View

JSF & CDI: Dreamteam @Work

Refactoring - Step 3

Der „Klassiker“

Monster UseCaseMonster UseCase

String basierte Navi

> via BeanValidation Logik-Validierung (sorry, OT)> via Event und @Observes UseCase Splittung

CDI @Work> Refactoring - Step 3: Split UseCase

Der „Klassiker“ refactored

OT: Double usernamecheck via

BeanValidation

Der „Klassiker“ refactored

OT: Double usernamecheck via

BeanValidation

Loosly coupled UseCase via Event

Loosly coupled UseCase via Event

Der „Klassiker“ refactored Event ConsumerEvent Consumer

Event ConsumerEvent Consumer

Der „Klassiker“ refactored Event ConsumerEvent Consumer

Event ConsumerEvent Consumer

JSF & CDI: Dreamteam @Work

Refactoring - Step 4

Der „Klassiker“

TX

> via @Interceptor UseCase Transaktion

CDI @Work> Refactoring - Step 4:

Der „Klassiker“ refactored

Transactional UseCaseTransactional UseCase

Der „Klassiker“ refactored

??Transactional

AnnotationTransactional

Annotation

Der „Klassiker“ refactoredTransactional

InterceptorTransactional

Interceptor

JSF & CDI: Dreamteam @Work

Refactoring - Step 5

Der „Klassiker“

Session statt ConversationSession statt Conversation

Scope MismatchScope Mismatch

> via @ConversationScoped Wizard

CDI @Work> Refactoring - Step 4:

CDI @Work

Der „Klassiker“ refactored

Der „Klassiker“ refactored

TX

Mis

Pieces

sing

Bessere Conversationen

Bessere Conversationen

Built-in TransaktionenBuilt-in Transaktionen

weitere Scopesweitere Scopes

typesafe Navigationtypesafe Navigation

und vieles mehr ...und vieles mehr ...

Missing Pieces