Date post: | 26-Jun-2015 |
Category: |
Technology |
Upload: | open-knowledge-gmbh |
View: | 655 times |
Download: | 1 times |
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