Download - Andreas Hartmann - Herbstcampus 2020
SchlankheitskurLean Web Architecture mit JSF 2.0, CDI & Co.
Andreas Hartmannadesso AG
SchlankheitskurLean Web Architecture mit JSF 2.0, CDI & Co.
Andreas Hartmann
05.09.2012
Agenda
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.2
Architecture Vision
Lean Webarchitecture
JSF meets CDI
Technical Solutions
Architecture Vision
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.3
Architecture Vision – 3 Layer Reflex
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.4
Presentation Layer
Business Layer <<Service>>
<<GUI>>
Integration Layer <<Adapter>>
<<D
om
ain
Mo
del
>>
Over-engineering
Boiler Plate Code
Expensive
Architecture Vision – Cross-Sectional Tasks
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.5
Architecture Vision – Technology Stack
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.6
Lean Webarchitecture – Tiny Applications
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.7
Client Tier
<<View>>
<<Adapter DB>>
<< . . . >>
MiddleTier
<<Presenter>>
<<Model>>
<<Domain Model>>
Spring Data
jQuery
Bean Validation
Bean Validation
JSF
CDI
Lombok
Lean Webarchitecture – Large Scale Applications
05.09.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.8
Client Tier
<<View>>
MiddleTier
<<Domain Model>>
jQuery
<<Presenter>> <<Adapter DB>><<Service>>
<<Model>> <<. . . >> << . . . >>
JSF
Spring Data
Doozer
CDI
Bean Validation
Bean Validation
Lombok
Warum CDI?
Dependency Injection
► Container steuert Objekte und Abhängigkeiten
> Instanziiert Objekte
> Injiziert Abhängigkeiten zur Laufzeit (lose Kopplung)
► Konfiguration über Annotations oder XML-Datei
► Populär geworden durch das Spring Framework
► Seit EJB3.0 auch in Java EE verfügbar
> @EJB
> @PersistenceUnit
> @Resource
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
Warum CDI?
Dependency Injection mit CDI
► Standardisiertes DI für Java (SE/EE)
> Typsicherheit
> Wiederverwendbarkeit
> Testbarkeit
> Flexiblität
> Lifecycle „Awareness“
► User Story driven injizieren
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
CDI Bausteine
CDI Bausteine
► Typsicherheit
> Stereotypes
> Qualifier
> Alternatives
► Lose Kopplung> Interceptors
> Decorator
> Events
► Sichtbarkeiten
> Scopes
> Lifecycle Awareness
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
CDI im Detail
10.08.2012
Facelets(JSF)
@ManagedBean(JSF)@Named
PostBoxService
#{ ... }
@Inject
User
...
Lean Web Architecture mit JSF 2.0, CDI & Co.
CDI im Detail
CDI Managed Bean
10.08.2012
#{userController}#{userController}
Injection PointInjection Point
gültig für Requestgültig für Request
import javax.enterprise.context.RequestScoped;import javax.inject.Named;import javax.inject.Inject;
@Named("userController")@RequestScopedpublic class UserController {
@Injectprivate UserService userService;
private List<User> users;
@PostConstructprivate void init() {
this.users = userService.findAllUsers();}
POJOPOJO
Lean Web Architecture mit JSF 2.0, CDI & Co.
CDI im Detail
CDI Injection Points
► Field Injection
► Constructor Injection
► Setter Injection
10.08.2012
@Injectprivate UserService userService;
@Injectpublic UserController(UserService userService) {
this.userService = userService;}
@Injectpublic void setUserService(UserService userService) {
this.userService = userService;}
Lean Web Architecture mit JSF 2.0, CDI & Co.
User Story driven injizieren
Qualifier & Producer
► Aktuellen Benutzer injizieren
@Inject @Current private User user;
► Fachlichkeit injizieren
@Inject @Admin private List<User> administrators;
@Inject @Editor private List<User> editors;
► Infrastruktur injizieren@Inject @UserDB private EntityManager userDB;
@Inject @ProductDB private EntityManager productDB;
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
User Story driven injizieren
Qualifier & Producer
10.08.2012
import de.adesso.cdi.common.Current;
import javax.enterprise.inject.Produces;
@Named@SessionScopedpublic class Authenticationimplements Serializable {
private User authenticatedUser;
public String authenticate() {...}
@Produces@Named("authenticatedUser")@Currentpublic User getAuthenticatedUser() {
return authenticatedUser;}
EL: #{authenticatedUser}EL: #{authenticatedUser}
Lean Web Architecture mit JSF 2.0, CDI & Co.
Fachlichkeit statt Infrastruktur injizieren
Qualifier & Producer
10.08.2012
import de.adesso.cdi.common.Current;
public class CustomerService implements CustomerService {
@Inject @Currentprivate User currentUser;
public void addCustomer(Customer customer) {customer.setCreator(currentUser);em.persist(customer);
}
Lean Web Architecture mit JSF 2.0, CDI & Co.
HTML 5
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►Mit JSF2.2 auch HTML5 Komponenten
Custom Components
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►Technische Umsetzung des Styleguides
jQuery
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►freie, umfangreiche JavaScript Bibliothek
►komfortable Möglichkeit zur DOM Manipulation
►Erweiterbarkeit durch Plugins (u.a. DataTable)
Lombok
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►Reduziert BoilerplateCode durch Annoations
>@Getter, @Setter
>@ToString
>@HashCodeAndEquals
>@Data
> . . .
►DelombokFunktionalität
►Eclipse Support
JSR 303: Bean Validation
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►Standardisierung von Constraints in Form von Annotations
►Standardisierung des Metadata API
►Integration anderer Frameworks wie z.B. JSF und JPA
Doozer
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►Java Bean toJava Bean Mapper
SpringData
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
►ermöglicht Zugriff auf relationale und NoSQLDatenbanken
►CDI Integration
10.08.2012 Lean Web Architecture mit JSF 2.0, CDI & Co.
Vielen Dank!
Andreas Hartmannadesso AG