Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[GER] - Warum ich so auf das C von CDI stehe

[GER] - Warum ich so auf das C von CDI stehe

CDI (Context Dependency Injection) ermöglicht es dem Entwickler skalierbare und flexible Architekturen aufzubauen die auf einem Java(EE) Server als auch auf dem Desktop laufen. Wie aber sollten DesignPattern aufgebaut werden unter Verwendung von CDI? Was für einen Einfluss hat Java 8 auf die DesignPattern, wie wird es mit der neuen Streams API kombiniert?
Höhepunkt ist die Kombination von klassischen Reflection-Einsatzgebieten wie z.B. dynamic Proxies mit CDI und Cross-Language Injections.

Avatar for Sven Ruppert

Sven Ruppert

November 09, 2015

Other Decks in Programming

Transcript

  1. @SvenRuppert 4/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? oft gehörte Antwort kürzere Notation.. *oje* Manchmal ist die Notation per Inject kürzer. Sobald allerdings die einzelnen Qualifier dazukommen, ist meist der Aufwand zum Aufruf eines Konstruktors kaum unterschiedlich. Verkürzen der Notation ist natürlich nicht das Ziel von CDI
  2. @SvenRuppert 5/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? lösen/entfernen von statischen Abhängigkeiten
  3. @SvenRuppert 6/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? lösen/entfernen von statischen Abhängigkeiten Dieser Punkt ist einer der wesentlichen. Also: Wie kann man zur Entwicklungszeit die Abhängigkeiten zu den anderen Projektmodulen möglichst gering halten?
  4. @SvenRuppert 7/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? lösen/entfernen von statischen Abhängigkeiten Dieser Punkt ist einer der wesentlichen. Also: Wie kann man zur Entwicklungszeit die Abhängigkeiten zu den anderen Projektmodulen möglichst gering halten? Gehen wir von der Definition einer Liste aus. Als Rückgabewert einer Methode wird eine Instanz der Implementierung von List verwendet. p u b l i c L i s t < D a t a > e x e c u t e ( ) { . . . } ; J A V A
  5. @SvenRuppert 8/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Damit sind nachfolgende Aufrufer nicht mehr an die Implementierung der List gebunden. i m p o r t j a v a . u t i l . L i s t ; i m p o r t j a v a . u t i l . A r r a y L i s t ; p u b l i c L i s t < D a t a > e x e c u t e ( ) { f i n a l L i s t < D a t a > r e s u l t = n e w A r r a y L i s t < > ( ) ; / / . . . . r e t u r n r e s u l t ; } J A V A
  6. @SvenRuppert 9/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Damit sind nachfolgende Aufrufer nicht mehr an die Implementierung der List gebunden. In der Methode jedoch besteht meist die Abhängigkeit zu der entsprechenden Implementierung obwohl auch das meist nicht notwendig ist. i m p o r t j a v a . u t i l . L i s t ; i m p o r t j a v a . u t i l . A r r a y L i s t ; p u b l i c L i s t < D a t a > e x e c u t e ( ) { f i n a l L i s t < D a t a > r e s u l t = n e w A r r a y L i s t < > ( ) ; / / . . . . r e t u r n r e s u l t ; } J A V A
  7. @SvenRuppert 10/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Gehen wir davon aus, dass keine spezifischen Methoden der ArrayList verwendet werden. Selten werden Methoden wie z.B. trimToSize() verwendet.
  8. @SvenRuppert 11/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Gehen wir davon aus, dass keine spezifischen Methoden der ArrayList verwendet werden. Selten werden Methoden wie z.B. trimToSize() verwendet. Somit ist die statische Abhängigkeit zu der ArrayList nicht notwendig.
  9. @SvenRuppert 12/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Gehen wir davon aus, dass keine spezifischen Methoden der ArrayList verwendet werden. Selten werden Methoden wie z.B. trimToSize() verwendet. Somit ist die statische Abhängigkeit zu der ArrayList nicht notwendig. Sollte sich zur Laufzeit herausstellen, das die Wahl dieser Implementierung nicht optimal gewesen ist, muss der Quelltext angepasst und neu verteilt werden.
  10. @SvenRuppert 13/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Gehen wir davon aus, dass keine spezifischen Methoden der ArrayList verwendet werden. Selten werden Methoden wie z.B. trimToSize() verwendet. Somit ist die statische Abhängigkeit zu der ArrayList nicht notwendig. Sollte sich zur Laufzeit herausstellen, das die Wahl dieser Implementierung nicht optimal gewesen ist, muss der Quelltext angepasst und neu verteilt werden. z.B. Mit std SE Mitteln kann man das durch entsprechende Factories lösen.
  11. @SvenRuppert 14/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Mit std SE Mitteln kann man das durch entsprechende Factories lösen. Beispielhaft soll hier folgende Implementierung verwendet werden. i m p o r t j a v a . u t i l . A r r a y L i s t ; i m p o r t j a v a . u t i l . L i n k e d L i s t ; i m p o r t j a v a . u t i l . L i s t ; p u b l i c c l a s s L i s t F a c t o r y { p u b l i c L i s t c r e a t e A r r a y L i s t ( ) { r e t u r n n e w A r r a y L i s t ( ) ; } p u b l i c L i s t c r e a t e L i n k e d L i s t ( ) { r e t u r n n e w L i n k e d L i s t ( ) ; } p u b l i c L i s t c r e a t e L i s t ( ) { r e t u r n n e w A r r a y L i s t ( ) ; } } J A V A
  12. @SvenRuppert 15/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Haben wir damit etwas erreicht?
  13. @SvenRuppert 16/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Haben wir damit etwas erreicht? ... bzw was haben wir damit erreicht?
  14. @SvenRuppert 17/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Haben wir damit etwas erreicht? ... bzw was haben wir damit erreicht? z.B. Die Entwickler verwenden nun diese Factory.
  15. @SvenRuppert 18/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Haben wir damit etwas erreicht? ... bzw was haben wir damit erreicht? z.B. Die Entwickler verwenden nun diese Factory. -> wenn sie wissen das es diese gibt! ;-)
  16. @SvenRuppert 19/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Vorher / Nachher (1/2) i m p o r t j a v a . u t i l . L i s t ; i m p o r t j a v a . u t i l . A r r a y L i s t ; p u b l i c L i s t < D a t a > e x e c u t e ( ) { f i n a l L i s t < D a t a > r e s u l t = n e w A r r a y L i s t < > ( ) ; / / . . . . r e t u r n r e s u l t ; } J A V A
  17. @SvenRuppert 20/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Vorher / Nachher (2/2) i m p o r t j a v a . u t i l . L i s t ; i m p o r t j a v a . u t i l . A r r a y L i s t ; p u b l i c L i s t < D a t a > e x e c u t e ( ) { f i n a l L i s t < D a t a > r e s u l t = n e w A r r a y L i s t < > ( ) ; / / . . . . r e t u r n r e s u l t ; } i m p o r t j a v a . u t i l . L i s t ; i m p o r t o r g . r a p i d p m . d e m o . L i s t F a c t o r y ; p u b l i c L i s t < D a t a > e x e c u t e ( ) { f i n a l L i s t l i s t = n e w L i s t F a c t o r y ( ) . c r e a t e A r r a y L i s t ( ) ; / / . . . . r e t u r n r e s u l t ; } J A V A
  18. @SvenRuppert 21/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Bisher wurde nun die statische Abhängigkeit zur ArrayList verhindert.
  19. @SvenRuppert 22/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Bisher wurde nun die statische Abhängigkeit zur ArrayList verhindert. Die Entscheidung eine ArrayList zu nehmen ist jedoch immer noch explizit gefallen.
  20. @SvenRuppert 23/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Bisher wurde nun die statische Abhängigkeit zur ArrayList verhindert. Die Entscheidung eine ArrayList zu nehmen ist jedoch immer noch explizit gefallen. Die Abhängigkeit zur Factory wurde hinzugefügt.
  21. @SvenRuppert 24/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Bisher wurde nun die statische Abhängigkeit zur ArrayList verhindert. Die Entscheidung eine ArrayList zu nehmen ist jedoch immer noch explizit gefallen. Die Abhängigkeit zur Factory wurde hinzugefügt. Die Implementierung der ListFactory selber hat auch wieder die statischen Abhängigkeiten zu allen vorgesehenen Implementierungen.
  22. @SvenRuppert 25/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Anforderung Nr 1: keine statischen Abhängigkeiten zu spezifischen Implementierungen
  23. @SvenRuppert 26/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Anforderung Nr 1: keine statischen Abhängigkeiten zu spezifischen Implementierungen Anforderung Nr 2: keine statischen Entscheidungen für spezifische Implementierungen
  24. @SvenRuppert 27/122 Warum CDI oder gibt es einen tieferen Sinn

    dahinter? Anforderung Nr 1: keine statischen Abhängigkeiten zu spezifischen Implementierungen Anforderung Nr 2: keine statischen Entscheidungen für spezifische Implementierungen Was ist jetzt eine mögliche Lösung ???
  25. @SvenRuppert 29/122 Lösungsversuch Nr 1 basierend auf Java SE Eine

    etwas dynamischere Lösung... i m p o r t j a v a . u t i l . A r r a y L i s t ; i m p o r t j a v a . u t i l . L i n k e d L i s t ; i m p o r t j a v a . u t i l . L i s t ; i m p o r t o r g . r a p i d p m . d e m o . c d i . c o m m o n s . r e g i s t r y . C o n t e x t R e s o l v e r ; p u b l i c c l a s s L i s t F a c t o r y { p u b l i c L i s t c r e a t e L i s t ( f i n a l C o n t e x t R e s o l v e r c o n t e x t R e s o l v e r ) { i f ( c o n t e x t R e s o l v e r = = n u l l ) { r e t u r n c r e a t e A r r a y L i s t ( ) ; } e l s e { i f ( c o n t e x t R e s o l v e r . r e s o l v e C o n t e x t ( ) ) { r e t u r n c r e a t e A r r a y L i s t ( ) ; } e l s e { r e t u r n c r e a t e L i n k e d L i s t ( ) ; } } } } J A V A
  26. @SvenRuppert 30/122 Lösungsversuch Nr 1 basierend auf Java SE Eine

    etwas dynamischere Lösung... Die Komplexität der Entscheidung liegt nun im ContextResolver
  27. @SvenRuppert 31/122 Lösungsversuch Nr 1 basierend auf Java SE Eine

    etwas dynamischere Lösung... Die Komplexität der Entscheidung liegt nun im ContextResolver Abhängigkeit in der Factory zum ContextResolver hinzugefügt
  28. @SvenRuppert 32/122 Lösungsversuch Nr 1 basierend auf Java SE Eine

    etwas dynamischere Lösung... Die Komplexität der Entscheidung liegt nun im ContextResolver Abhängigkeit in der Factory zum ContextResolver hinzugefügt Gewonnen: zur Laufzeit sich für eine Implementierung entscheiden.
  29. @SvenRuppert 33/122 Lösungsversuch Nr 1 basierend auf Java SE Möchte

    man nun die Factory so erstellen, dass diese wiederum keine statischen Abhängigkeiten zu den jeweiligen Contexten bzw Implementierungen der Liste hat, muss eine z.B. Registry gebaut werden.
  30. @SvenRuppert 34/122 Lösungsversuch Nr 1 basierend auf Java SE Möchte

    man nun die Factory so erstellen, dass diese wiederum keine statischen Abhängigkeiten zu den jeweiligen Contexten bzw Implementierungen der Liste hat, muss eine z.B. Registry gebaut werden. Dort kann man zur Laufzeit die jeweiligen Implementierungen registrieren und für eine Auflösung zur Verfügung stellen.
  31. @SvenRuppert 35/122 Lösungsversuch Nr 1 basierend auf Java SE Möchte

    man nun die Factory so erstellen, dass diese wiederum keine statischen Abhängigkeiten zu den jeweiligen Contexten bzw Implementierungen der Liste hat, muss eine z.B. Registry gebaut werden. Dort kann man zur Laufzeit die jeweiligen Implementierungen registrieren und für eine Auflösung zur Verfügung stellen. Hier hilft CDI durch seine Konzepte, ohne das man sich mit der Basisimplementierung der Infrastruktur beschäftigen muss.
  32. @SvenRuppert 36/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt
  33. @SvenRuppert 37/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt @ I n j e c t L i s t l i s t ; J A V A
  34. @SvenRuppert 38/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt @ I n j e c t @ C D I L e g a c y T e s t L i s t l i s t ; J A V A
  35. @SvenRuppert 39/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt @ I n j e c t @ C D I L e g a c y T e s t L i s t l i s t ; @ P r o d u c e s @ C D I L e g a c y T e s t p u b l i c L i s t c r e a t e L i s t ( . . . ) { . . . } J A V A
  36. @SvenRuppert 40/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt @ I n j e c t @ C D I L e g a c y T e s t L i s t l i s t ; @ P r o d u c e s @ C D I L e g a c y T e s t p u b l i c L i s t c r e a t e L i s t ( I n j e c t i o n P o i n t i n j e c t i o n P o i n t , B e a n M a n a g e r b e a n M a n a g e r , C o n t e x t R e s o l v e r c o n t e x t R e s o l v e r ) { . . . . } J A V A
  37. @SvenRuppert 41/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt @ I n j e c t @ C D I L e g a c y T e s t L i s t l i s t ; @ P r o d u c e s @ C D I L e g a c y T e s t p u b l i c L i s t c r e a t e L i s t ( I n j e c t i o n P o i n t i n j e c t i o n P o i n t , B e a n M a n a g e r b e a n M a n a g e r , C o n t e x t R e s o l v e r c o n t e x t R e s o l v e r ) { b o o l e a n b = c o n t e x t R e s o l v e r . r e s o l v e C o n t e x t ( . . . ) ; / / t r e f f e n d e r E n t s c h e i d u n g e n . . . i f ( b ) { r e t u r n n e w L i n k e d L i s t ( ) ; } e l s e { r e t u r n n e w A r r a y L i s t ( ) ; } } J A V A
  38. @SvenRuppert 42/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen werden per @Inject durch den Container zur Verfügung gestellt Aber leider ist das immer noch zu dem Zeitpunkt zu dem die umliegende Instanz erzeugt wird. @ I n j e c t @ C D I L e g a c y T e s t L i s t l i s t ; @ P r o d u c e s @ C D I L e g a c y T e s t p u b l i c L i s t c r e a t e L i s t ( I n j e c t i o n P o i n t i n j e c t i o n P o i n t , B e a n M a n a g e r b e a n M a n a g e r , C o n t e x t R e s o l v e r c o n t e x t R e s o l v e r ) { b o o l e a n b = c o n t e x t R e s o l v e r . r e s o l v e C o n t e x t ( . . . ) ; / / t r e f f e n d e r E n t s c h e i d u n g e n . . . i f ( b ) { r e t u r n n e w L i n k e d L i s t ( ) ; } e l s e { r e t u r n n e w A r r a y L i s t ( ) ; } } J A V A
  39. @SvenRuppert 43/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen können auch erst zum Zeitpunkt der Verwendung instanziiert werden.
  40. @SvenRuppert 44/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen können auch erst zum Zeitpunkt der Verwendung instanziiert werden. Damit sind späte Entscheidungen möglich
  41. @SvenRuppert 45/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen können auch erst zum Zeitpunkt der Verwendung instanziiert werden. Damit sind späte Entscheidungen möglich @ I n j e c t @ C D I L e g a c y T e s t I n s t a n c e < L i s t > l i s t I n s t a n c e ; J A V A
  42. @SvenRuppert 46/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen können auch erst zum Zeitpunkt der Verwendung instanziiert werden. Damit sind späte Entscheidungen möglich @ I n j e c t @ C D I L e g a c y T e s t I n s t a n c e < L i s t > l i s t I n s t a n c e ; / / . . s p ä t e r f i n a l L i s t l i s t = l i s t I n s t a n c e . g e t ( ) ; J A V A
  43. @SvenRuppert 47/122 endlich CDI ;-) basierend auf Weld / WELD-SE

    Instanzen können auch erst zum Zeitpunkt der Verwendung instanziiert werden damit sind späte Entscheidungen möglich @ I n j e c t @ C D I L e g a c y T e s t I n s t a n c e < L i s t > l i s t I n s t a n c e ; / / . . s p ä t e r f i n a l L i s t l i s t = l i s t I n s t a n c e . g e t ( ) ; @ P r o d u c e s @ C D I L e g a c y T e s t p u b l i c L i s t c r e a t e L i s t ( I n j e c t i o n P o i n t i n j e c t i o n P o i n t , B e a n M a n a g e r b e a n M a n a g e r , C o n t e x t R e s o l v e r c o n t e x t R e s o l v e r ) { b o o l e a n b = c o n t e x t R e s o l v e r . r e s o l v e C o n t e x t ( . . . ) ; / / t r e f f e n d e r E n t s c h e i d u n g e n . . . i f ( b ) { r e t u r n n e w L i n k e d L i s t ( ) ; } e l s e { r e t u r n n e w A r r a y L i s t ( ) ; } } J A V A
  44. @SvenRuppert 48/122 CDI was wurde bis jetzt erreicht? Trennung der

    statischen Abhängigkeiten auf Klassenebene innerhalb der Vererbung
  45. @SvenRuppert 49/122 CDI was wurde bis jetzt erreicht? Trennung der

    statischen Abhängigkeiten auf Klassenebene innerhalb der Vererbung Keine "allwissende" Factory, die alle statischen Abhängigkeiten besitzt
  46. @SvenRuppert 50/122 CDI was wurde bis jetzt erreicht? Trennung der

    statischen Abhängigkeiten auf Klassenebene innerhalb der Vererbung Keine "allwissende" Factory, die alle statischen Abhängigkeiten besitzt Für jede Entscheidung einen Producer
  47. @SvenRuppert 51/122 CDI was wurde bis jetzt erreicht? Trennung der

    statischen Abhängigkeiten auf Klassenebene innerhalb der Vererbung Keine "allwissende" Factory, die alle statischen Abhängigkeiten besitzt Für jede Entscheidung einen Producer.. wie funktioniert das praktisch?
  48. @SvenRuppert 52/122 CDI was wurde bis jetzt erreicht? Trennung der

    statischen Abhängigkeiten auf Klassenebene innerhalb der Vererbung Keine "allwissende" Factory, die alle statischen Abhängigkeiten besitzt Für jede Entscheidung einen Producer.. wie funktioniert das praktisch? ... sehen wir uns gleich noch an.... Bitte ein wenig Geduld...
  49. @SvenRuppert 53/122 CDI was wurde dafür in Kauf genommen? statische

    Kopplung über AnnotationsLiterale: @ I n j e c t @ M y Q u a l i f i e r L i s t l i s t e ; J A V A
  50. @SvenRuppert 54/122 CDI was wurde dafür in Kauf genommen? statische

    Kopplung über AnnotationsLiterale: schlechterer Umgang mit Generics @ I n j e c t @ M y Q u a l i f i e r L i s t l i s t e ; J A V A
  51. @SvenRuppert 55/122 CDI was wurde dafür in Kauf genommen? statische

    Kopplung über AnnotationsLiterale: schlechterer Umgang mit Generics keine Komplexitätsreduktion für den Entwickler @ I n j e c t @ M y Q u a l i f i e r L i s t l i s t e ; J A V A
  52. @SvenRuppert 56/122 CDI explained by code HelloLogger zum aufwärmen/wiederholen klassischer

    Fall, Logger im System @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A
  53. @SvenRuppert 57/122 CDI explained by code HelloLogger zum aufwärmen/wiederholen klassischer

    Fall, Logger im System @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; @ Q u a l i f i e r @ R e t e n t i o n ( v a l u e = R e t e n t i o n P o l i c y . R U N T I M E ) @ T a r g e t ( { E l e m e n t T y p e . M E T H O D , E l e m e n t T y p e . F I E L D , E l e m e n t T y p e . P A R A M E T E R , E l e m e n t T y p e . T Y P E } ) p u b l i c @ i n t e r f a c e C D I L o g g e r { } J A V A
  54. @SvenRuppert 58/122 CDI explained by code HelloLogger zum aufwärmen/wiederholen klassischer

    Fall, Logger im System @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; @ Q u a l i f i e r @ R e t e n t i o n ( v a l u e = R e t e n t i o n P o l i c y . R U N T I M E ) @ T a r g e t ( { E l e m e n t T y p e . M E T H O D , E l e m e n t T y p e . F I E L D , E l e m e n t T y p e . P A R A M E T E R , E l e m e n t T y p e . T Y P E } ) p u b l i c @ i n t e r f a c e C D I L o g g e r { } @ P r o d u c e s @ C D I L o g g e r p u b l i c L o g g e r p r o d u c e L o g 4 J L o g g e r ( I n j e c t i o n P o i n t i P , B e a n M a n a g e r b e a n M a n a g e r ) { f i n a l C l a s s < ? > d e c l a r i n g C l a s s = i P . g e t M e m b e r ( ) . g e t D e c l a r i n g C l a s s ( ) ; r e t u r n n e w L o g g e r ( d e c l a r i n g C l a s s ) ; } J A V A
  55. @SvenRuppert 59/122 CDI explained by code HelloLogger zum aufwärmen/wiederholen klassischer

    Fall, Logger im System @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; @ Q u a l i f i e r @ R e t e n t i o n ( v a l u e = R e t e n t i o n P o l i c y . R U N T I M E ) @ T a r g e t ( { E l e m e n t T y p e . M E T H O D , E l e m e n t T y p e . F I E L D , E l e m e n t T y p e . P A R A M E T E R , E l e m e n t T y p e . T Y P E } ) p u b l i c @ i n t e r f a c e C D I L o g g e r { } @ P r o d u c e s @ C D I L o g g e r p u b l i c L o g g e r p r o d u c e L o g 4 J L o g g e r ( I n j e c t i o n P o i n t i P , B e a n M a n a g e r b e a n M a n a g e r ) { f i n a l C l a s s < ? > d e c l a r i n g C l a s s = i P . g e t M e m b e r ( ) . g e t D e c l a r i n g C l a s s ( ) ; r e t u r n n e w L o g g e r ( d e c l a r i n g C l a s s ) ; / / L o g g e r n i c h t g e m a n a g e d ! ! ! } J A V A
  56. @SvenRuppert 60/122 CDI explained by code HelloLogger zum aufwärmen /

    Hat uns das jetzt richtig weitergebracht? Referenz auf Factory wird ersetzt durch Qualifier. :-( @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A
  57. @SvenRuppert 61/122 CDI explained by code HelloLogger zum aufwärmen /

    Hat uns das jetzt richtig weitergebracht? Referenz auf Factory wird ersetzt durch Qualifier. :-( Spezifische Producer losgelöst von den anderen Producern @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A
  58. @SvenRuppert 62/122 CDI explained by code HelloLogger zum aufwärmen /

    Hat uns das jetzt richtig weitergebracht? Referenz auf Factory wird ersetzt durch Qualifier. :-( Spezifische Producer losgelöst von den anderen Producern zentrale Stelle für context-bezogene Entscheidungen @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A
  59. @SvenRuppert 63/122 CDI explained by code Qualifier und AnnotationsLiterale @

    I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A
  60. @SvenRuppert 64/122 CDI explained by code Qualifier und AnnotationsLiterale @

    I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( . . . ) ; J A V A
  61. @SvenRuppert 65/122 CDI explained by code Qualifier und AnnotationsLiterale @

    I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( . . . ) ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( . . ) { A n n o t a t i o n s L i t e r a l < T > p r o d A L = c o n t e x t R e s o l v e r . r e s o l v e ( . . ) ; } ; J A V A
  62. @SvenRuppert 66/122 CDI explained by code Qualifier und AnnotationsLiterale @

    I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( . . . ) ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( B e a n M a n a g e r b m , C o n t e x t R e s o l v e r c r ) { A n n o t a t i o n s L i t e r a l < T > p r o d A L = c o n t e x t R e s o l v e r . r e s o l v e ( . . ) ; r e t u r n c r e a t o r . g e t M a n a g e d I n s t a n c e ( L o g g e r . c l a s s , a n n o t a t i o n L i t e r a l ) ; } ; J A V A
  63. @SvenRuppert 67/122 CDI explained by code Qualifier und AnnotationsLiterale Es

    wird dynamisch auf ein AnnotationsLiteral aufgelöst. @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( . . . ) ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( B e a n M a n a g e r b m , C o n t e x t R e s o l v e r c r ) { A n n o t a t i o n s L i t e r a l < T > p r o d A L = c o n t e x t R e s o l v e r . r e s o l v e ( . . ) ; r e t u r n c r e a t o r . g e t M a n a g e d I n s t a n c e ( L o g g e r . c l a s s , a n n o t a t i o n L i t e r a l ) ; } ; J A V A
  64. @SvenRuppert 68/122 CDI explained by code Qualifier und AnnotationsLiterale Es

    wird dynamisch auf ein AnnotationsLiteral aufgelöst. AnnotationsLiteral und Klasse -> Auswahl des Producers @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( . . . ) ; J A V A @ P r o d u c e r @ C D I L o g g e r L o g g e r c r e a t e ( B e a n M a n a g e r b m , C o n t e x t R e s o l v e r c r ) { A n n o t a t i o n s L i t e r a l < T > p r o d A L = c o n t e x t R e s o l v e r . r e s o l v e ( . . ) ; r e t u r n c r e a t o r . g e t M a n a g e d I n s t a n c e ( L o g g e r . c l a s s , a n n o t a t i o n L i t e r a l ) ; } ; J A V A
  65. @SvenRuppert 69/122 CDI explained by code 1 / 6 ContextResolver

    / aus der Sicht des Entwicklers @ I n j e c t C D I C o n t e x t c o n t e x t ; / / z . B . e i n S i n g l e t o n @ I n j e c t C o n t e x t R e s o l v e r c r ; @ T e s t p u b l i c v o i d t e s t M o c k e d M o d u s 0 0 1 ( ) t h r o w s E x c e p t i o n { A s s e r t . a s s e r t F a l s e ( c o n t e x t . i s M o c k e d M o d u s A c t i v e ( ) ) ; f i n a l A n n o t a t i o n L i t e r a l a n n o t a t i o n L i t e r a l P r o d = c r . r e s o l v e C o n t e x t ( t h i s . g e t C l a s s ( ) ) ; A s s e r t . a s s e r t E q u a l s ( n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s > ( ) { } , a n n o t a t i o n L i t e r a l P r o d ) ; } J A V A
  66. @SvenRuppert 70/122 CDI explained by code 1 / 6 ContextResolver

    / aus der Sicht des Entwicklers @ I n j e c t C D I C o n t e x t c o n t e x t ; / / z . B . e i n S i n g l e t o n @ I n j e c t C o n t e x t R e s o l v e r c r ; @ T e s t p u b l i c v o i d t e s t M o c k e d M o d u s 0 0 1 ( ) t h r o w s E x c e p t i o n { A s s e r t . a s s e r t F a l s e ( c o n t e x t . i s M o c k e d M o d u s A c t i v e ( ) ) ; f i n a l A n n o t a t i o n L i t e r a l a n n o t a t i o n L i t e r a l P r o d = c r . r e s o l v e C o n t e x t ( t h i s . g e t C l a s s ( ) ) ; A s s e r t . a s s e r t E q u a l s ( n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s > ( ) { } , a n n o t a t i o n L i t e r a l P r o d ) ; ( ( T e s t C o n t e x t ) c o n t e x t ) . s e t T e s t M o d u s ( t r u e ) ; A s s e r t . a s s e r t T r u e ( c o n t e x t . i s M o c k e d M o d u s A c t i v e ( ) ) ; } J A V A
  67. @SvenRuppert 71/122 CDI explained by code 1 / 6 ContextResolver

    / aus der Sicht des Entwicklers @ I n j e c t C D I C o n t e x t c o n t e x t ; / / z . B . e i n S i n g l e t o n @ I n j e c t C o n t e x t R e s o l v e r c r ; @ T e s t p u b l i c v o i d t e s t M o c k e d M o d u s 0 0 1 ( ) t h r o w s E x c e p t i o n { A s s e r t . a s s e r t F a l s e ( c o n t e x t . i s M o c k e d M o d u s A c t i v e ( ) ) ; f i n a l A n n o t a t i o n L i t e r a l a n n o t a t i o n L i t e r a l P r o d = c r . r e s o l v e C o n t e x t ( t h i s . g e t C l a s s ( ) ) ; A s s e r t . a s s e r t E q u a l s ( n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s > ( ) { } , a n n o t a t i o n L i t e r a l P r o d ) ; ( ( T e s t C o n t e x t ) c o n t e x t ) . s e t T e s t M o d u s ( t r u e ) ; A s s e r t . a s s e r t T r u e ( c o n t e x t . i s M o c k e d M o d u s A c t i v e ( ) ) ; f i n a l A n n o t a t i o n L i t e r a l a n n o t a t i o n L i t e r a l = c r . r e s o l v e C o n t e x t ( t h i s . g e t C l a s s ( ) ) ; A s s e r t . a s s e r t E q u a l s ( n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s M o c k e d > ( ) { } , a n n o t a t i o n L i t e r a l ) ; } J A V A
  68. @SvenRuppert 74/122 CDI explained by code 2a / 6 ContextResolver

    Die Annotation mit @CDINotMapped, um das Interface explizit in den Namensraum zu setzen @ C D I N o t M a p p e d p u b l i c i n t e r f a c e C D I C o n t e x t { p u b l i c b o o l e a n i s M o c k e d M o d u s A c t i v e ( ) ; } J A V A
  69. @SvenRuppert 75/122 CDI explained by code 2b / 6 ContextResolver

    Mit klassischen Interzeptoren kann man Querschnittsthemen deklarieren. Nur allgemein umschalten auf Mocked/NotMocked möglich? @ I n t e r c e p t o r B i n d i n g @ T a r g e t ( { E l e m e n t T y p e . T Y P E , E l e m e n t T y p e . M E T H O D } ) @ R e t e n t i o n ( v a l u e = R e t e n t i o n P o l i c y . R U N T I M E ) @ I n h e r i t e d p u b l i c @ i n t e r f a c e C h e c k M o c k e d C o n t e x t { } p u b l i c i n t e r f a c e C o n t e x t R e s o l v e r { @ C h e c k M o c k e d C o n t e x t p u b l i c A n n o t a t i o n L i t e r a l r e s o l v e C o n t e x t ( f i n a l C l a s s < ? > t a r g e t C l a s s ) ; } J A V A
  70. @SvenRuppert 76/122 CDI explained by code 3a / 6 ContextResolver

    @ I n t e r c e p t o r @ C h e c k M o c k e d C o n t e x t p u b l i c c l a s s M o c k e d I n t e r c e p t o r i m p l e m e n t s S e r i a l i z a b l e { @ I n j e c t C D I C o n t e x t c o n t e x t ; p r i v a t e @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; @ A r o u n d I n v o k e p u b l i c O b j e c t c h e c k M o c k e d M o d e ( I n v o c a t i o n C o n t e x t c t x ) t h r o w s E x c e p t i o n { i f ( c o n t e x t . i s M o c k e d M o d u s A c t i v e ( ) ) { i f ( l o g g e r . i s D e b u g E n a b l e d ( ) ) { l o g g e r . d e b u g ( " M o c k e d M o d u s a c t i v e " ) ; } r e t u r n n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s M o c k e d > ( ) { } ; } e l s e { r e t u r n c t x . p r o c e e d ( ) ; } } } J A V A
  71. @SvenRuppert 77/122 CDI explained by code 3b / 6 ContextResolver

    Durch Interzeptoren meist nur allgemeine Umschaltlogik darstellbar
  72. @SvenRuppert 78/122 CDI explained by code 3b / 6 ContextResolver

    Durch Interzeptoren meist nur allgemeine Umschaltlogik darstellbar Benötigt wird aber evtl differenziertes Umschalten.
  73. @SvenRuppert 79/122 CDI explained by code 3b / 6 ContextResolver

    Durch Interzeptoren meist nur allgemeine Umschaltlogik darstellbar Benötigt wird aber evtl differenziertes Umschalten. Interzeptoren werden statisch definiert - schade....
  74. @SvenRuppert 80/122 CDI explained by code 4a / 6 ContextResolver

    @ C D I C o m m o n s p u b l i c c l a s s D e f a u l t C o n t e x t R e s o l v e r i m p l e m e n t s C o n t e x t R e s o l v e r { @ I n j e c t @ C D I L o g g e r L o g g e r l o g g e r ; @ I n j e c t B e a n M a n a g e r b e a n M a n a g e r ; p u b l i c S e t < C o n t e x t R e s o l v e r > g e t t A l l C o n t e x t R e s o l v e r ( ) { f i n a l S e t < C o n t e x t R e s o l v e r > r e s u l t S e t = n e w H a s h S e t < > ( ) ; f i n a l S e t < B e a n < ? > > a l l B e a n s = b e a n M a n a g e r . g e t B e a n s ( C o n t e x t R e s o l v e r . c l a s s , n e w A n n o t a t i o n L i t e r a l < A n y > ( ) { } ) ; a l l B e a n s . f o r E a c h ( b - > b . g e t T y p e s ( ) . s t r e a m ( ) . f i l t e r ( t - > t . e q u a l s ( C o n t e x t R e s o l v e r . c l a s s ) ) . f i l t e r ( r - > ! r . g e t C l a s s ( ) . i s A n n o t a t i o n P r e s e n t ( C D I C o m m o n s M o c k e d . c l a s s ) ) . f o r E a c h ( t - > { f i n a l C o n t e x t R e s o l v e r c r = ( ( B e a n < C o n t e x t R e s o l v e r > ) b ) . c r e a t e ( b e a n M a n a g e r . c r e a t e C r e a t i o n a l C o n t e x t ( ( B e a n < C o n t e x t R e s o l v e r > ) b ) ) ; r e s u l t S e t . a d d ( c r ) ; } ) ) ; r e t u r n r e s u l t S e t ; } J A V A
  75. @SvenRuppert 81/122 CDI explained by code 4b / 6 ContextResolver

    p u b l i c S e t < C o n t e x t R e s o l v e r > g e t t A l l M o c k e d C o n t e x t R e s o l v e r ( ) { f i n a l S e t < C o n t e x t R e s o l v e r > r e s u l t S e t = n e w H a s h S e t < > ( ) ; f i n a l S e t < B e a n < ? > > a l l B e a n s = b e a n M a n a g e r . g e t B e a n s ( C o n t e x t R e s o l v e r . c l a s s , n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s M o c k e d > ( ) { } ) ; a l l B e a n s . f o r E a c h ( b - > b . g e t T y p e s ( ) . f o r E a c h ( t y p e - > { i f ( t y p e . e q u a l s ( C o n t e x t R e s o l v e r . c l a s s ) ) { f i n a l C o n t e x t R e s o l v e r t = ( ( B e a n < C o n t e x t R e s o l v e r > ) b ) . c r e a t e ( b e a n M a n a g e r . c r e a t e C r e a t i o n a l C o n t e x t ( ( B e a n < C o n t e x t R e s o l v e r > ) b ) ) ; r e s u l t S e t . a d d ( t ) ; } } ) ) ; r e t u r n r e s u l t S e t ; } J A V A
  76. @SvenRuppert 82/122 CDI explained by code 4c / 6 ContextResolver

    p u b l i c A n n o t a t i o n L i t e r a l r e s o l v e C o n t e x t ( C l a s s t a r g e t C l a s s ) { S t r e a m < C o n t e x t R e s o l v e r > c o n t e x t R e s o l v e r s M o c k e d = g e t t A l l M o c k e d C o n t e x t R e s o l v e r ( ) . s t r e a m ( ) ; S t r e a m < C o n t e x t R e s o l v e r > c o n t e x t R e s o l v e r s = g e t t A l l C o n t e x t R e s o l v e r ( ) . s t r e a m ( ) ; r e t u r n c o n t e x t R e s o l v e r s M o c k e d . f i l t e r ( r - > ( r . r e s o l v e C o n t e x t ( t a r g e t C l a s s ) ! = n u l l ) ) . m a p ( r - > r . r e s o l v e C o n t e x t ( t a r g e t C l a s s ) ) . f i n d F i r s t ( ) . o r E l s e ( c o n t e x t R e s o l v e r s . f i l t e r ( r - > ! r . g e t C l a s s ( ) . i s A n n o t a t i o n P r e s e n t ( C D I C o m m o n s M o c k e d . c l a s s ) ) . f i l t e r ( r - > ! r . g e t C l a s s ( ) . e q u a l s ( D e f a u l t C o n t e x t R e s o l v e r . c l a s s ) ) . f i l t e r ( r - > ( r . r e s o l v e C o n t e x t ( t a r g e t C l a s s ) ! = n u l l ) ) . m a p ( r - > r . r e s o l v e C o n t e x t ( t a r g e t C l a s s ) ) . f i n d F i r s t ( ) . o r E l s e ( n u l l ) ) ; } J A V A
  77. @SvenRuppert 83/122 CDI explained by code 5 / 6 ContextResolver

    @ S i n g l e t o n p u b l i c c l a s s T e s t C o n t e x t i m p l e m e n t s C D I C o n t e x t { p r i v a t e b o o l e a n t e s t M o d u s = f a l s e ; @ O v e r r i d e p u b l i c b o o l e a n i s M o c k e d M o d u s A c t i v e ( ) { r e t u r n t e s t M o d u s ; } p u b l i c b o o l e a n i s T e s t M o d u s ( ) { r e t u r n t e s t M o d u s ; } p u b l i c v o i d s e t T e s t M o d u s ( b o o l e a n t e s t M o d u s ) { t h i s . t e s t M o d u s = t e s t M o d u s ; } } p u b l i c c l a s s T e s t C o n t e x t R e s o l v e r i m p l e m e n t s C o n t e x t R e s o l v e r { @ I n j e c t C D I C o n t e x t c o n t e x t ; @ C h e c k M o c k e d C o n t e x t @ O v e r r i d e p u b l i c A n n o t a t i o n L i t e r a l r e s o l v e C o n t e x t ( C l a s s < ? > t a r g e t C l a s s ) { / / e n t s c h e i d e o b D u z u s t ä n d i g b i s t r e t u r n n e w A n n o t a t i o n L i t e r a l < C D I C o m m o n s > ( ) { } ; } } J A V A
  78. @SvenRuppert 84/122 CDI explained by code 6 / 6 ContextResolver

    Wir sind nun in der Lage dynamisch auf den Systemzustand zu reagieren.
  79. @SvenRuppert 85/122 CDI explained by code 6 / 6 ContextResolver

    Wir sind nun in der Lage dynamisch auf den Systemzustand zu reagieren. ContextResolver sind immer nur in ihrem fachlichen Bereich aktiv
  80. @SvenRuppert 86/122 CDI explained by code 6 / 6 ContextResolver

    Wir sind nun in der Lage dynamisch auf den Systemzustand zu reagieren. ContextResolver sind immer nur in ihrem fachlichen Bereich aktiv Unterscheidung auf z.B. Mandantenebene leicht realisierbar
  81. @SvenRuppert 87/122 CDI explained by code 1 / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator klassischer Decorator in CDI @ D e c o r a t o r p u b l i c a b s t r a c t c l a s s C o d e r D e c o r a t o r i m p l e m e n t s C o d e r { @ I n j e c t @ D e l e g a t e @ A n y C o d e r c o d e r ; p u b l i c S t r i n g c o d e S t r i n g ( S t r i n g s , i n t t v a l ) { i n t l e n = s . l e n g t h ( ) ; r e t u r n " \ " " + s + " \ " b e c o m e s " + " \ " " + c o d e r . c o d e S t r i n g ( s , t v a l ) + " \ " , " + l e n + " c h a r a c t e r s i n l e n g t h " ; } } I n s i d e b e a n s . x m l < d e c o r a t o r s > < c l a s s > d e c o r a t o r s . C o d e r D e c o r a t o r < / c l a s s > < / d e c o r a t o r s > J A V A
  82. @SvenRuppert 88/122 CDI explained by code 2 / 7 CDI

    managed DynamicObjectAdapter - der bessere Decorator Ein Decorator in CDI muss in der beans.xml definiert werden.
  83. @SvenRuppert 89/122 CDI explained by code 2 / 7 CDI

    managed DynamicObjectAdapter - der bessere Decorator Ein Decorator in CDI muss in der beans.xml definiert werden. Klasse mit einer speziellen Annotation @Decorator
  84. @SvenRuppert 90/122 CDI explained by code 2 / 7 CDI

    managed DynamicObjectAdapter - der bessere Decorator Ein Decorator in CDI muss in der beans.xml definiert werden. Klasse mit einer speziellen Annotation @Decorator Innerhalb des Decorators muss die Instanz des Originals injiziert werden
  85. @SvenRuppert 91/122 CDI explained by code 2 / 7 CDI

    managed DynamicObjectAdapter - der bessere Decorator Ein Decorator in CDI muss in der beans.xml definiert werden. Klasse mit einer speziellen Annotation @Decorator Innerhalb des Decorators muss die Instanz des Originals injiziert werden Decorator muss von der Original-Implementierung oder dem Interface ableiten
  86. @SvenRuppert 92/122 CDI explained by code 2 / 7 CDI

    managed DynamicObjectAdapter - der bessere Decorator Ein Decorator in CDI muss in der beans.xml definiert werden. Klasse mit einer speziellen Annotation @Decorator Innerhalb des Decorators muss die Instanz des Originals injiziert werden Decorator muss von der Original-Implementierung oder dem Interface ableiten ... geht das auch schöner ?
  87. @SvenRuppert 93/122 CDI explained by code 3 / 7 CDI

    managed DynamicObjectAdapter - der bessere Decorator Aus der Sicht des Entwicklers @ C D I N o t M a p p e d p u b l i c i n t e r f a c e D e m o L o g i c { p u b l i c d e f a u l t i n t a d d ( i n t a , i n t b ) { r e t u r n a + b ; } p u b l i c d e f a u l t i n t s u b ( i n t a , i n t b ) { r e t u r n a - b ; } } @ C D I N o t M a p p e d p u b l i c c l a s s D e m o L o g i c A d a p t e r _ A i m p l e m e n t s D e m o L o g i c { p u b l i c i n t a d d ( i n t a , i n t b ) { r e t u r n a + b + 1 0 0 ; } } @ S i n g l e t o n / / s o l l t e s c h o n b e k a n n t s e i n ; - ) p u b l i c c l a s s C o n t e x t { p u b l i c b o o l e a n o r i g i n a l = t r u e ; } J A V A
  88. @SvenRuppert 94/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic
  89. @SvenRuppert 95/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic
  90. @SvenRuppert 96/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1)
  91. @SvenRuppert 97/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 2.
  92. @SvenRuppert 98/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 2. Context-Switch auf mandantenabhängige Implementierung
  93. @SvenRuppert 99/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 2. Context-Switch auf mandantenabhängige Implementierung Holen einer Instanz der DemoLogic
  94. @SvenRuppert 100/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 2. Context-Switch auf mandantenabhängige Implementierung Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1)
  95. @SvenRuppert 101/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 2. Context-Switch auf mandantenabhängige Implementierung Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 102.
  96. @SvenRuppert 102/122 CDI explained by code 4a / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator Injizieren der Referenz auf DemoLogic Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 2. Context-Switch auf mandantenabhängige Implementierung Holen einer Instanz der DemoLogic Aufruf der Methode add(1,1) Überprüfung ob das Ergebnis den Erwartungen entspricht, hier der Wert 102. Kaffee trinken.
  97. @SvenRuppert 103/122 CDI explained by code 4b / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator @ I n j e c t @ D y n a m i c D e c o r a t o r T e s t I n s t a n c e < D e m o L o g i c > d e m o L o g i c ; @ I n j e c t C o n t e x t c o n t e x t ; @ T e s t p u b l i c v o i d t e s t D e m o L o g i c O r i g i n a l T e s t ( ) t h r o w s E x c e p t i o n { A s s e r t . a s s e r t N o t N u l l ( d e m o L o g i c ) ; f i n a l D e m o L o g i c d e m o L o g i c 1 = d e m o L o g i c . g e t ( ) ; f i n a l i n t a d d = d e m o L o g i c 1 . a d d ( 1 , 1 ) ; A s s e r t . a s s e r t E q u a l s ( 2 , a d d ) ; S y s t e m . o u t . p r i n t l n ( " a d d = " + a d d ) ; c o n t e x t . o r i g i n a l = f a l s e ; f i n a l D e m o L o g i c d e m o L o g i c 2 = d e m o L o g i c . g e t ( ) ; f i n a l i n t a d d A d a p t e d = d e m o L o g i c 2 . a d d ( 1 , 1 ) ; A s s e r t . a s s e r t E q u a l s ( 1 0 2 , a d d A d a p t e d ) ; S y s t e m . o u t . p r i n t l n ( " a d d A d a p t e d = " + a d d A d a p t e d ) ; } J A V A
  98. @SvenRuppert 104/122 CDI explained by code 4c / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator manuelles aktivieren von CDI.. yepp das geht p u b l i c < T > T a c t i v a t e C D I ( T t ) { f i n a l C l a s s a C l a s s = t . g e t C l a s s ( ) ; i f ( l o g g e r . i s D e b u g E n a b l e d ( ) ) { l o g g e r . d e b u g ( " a c t i v a t e C D I - > " + a C l a s s ) ; } A n n o t a t e d T y p e a n n o t a t i o n T y p e = b e a n M a n a g e r . c r e a t e A n n o t a t e d T y p e ( a C l a s s ) ; I n j e c t i o n T a r g e t i n j e c t i o n T a r g e t = b e a n M a n a g e r . c r e a t e I n j e c t i o n T a r g e t ( a n n o t a t i o n T y p e ) ; C r e a t i o n a l C o n t e x t c r e a t i o n a l C o n t e x t = b e a n M a n a g e r . c r e a t e C r e a t i o n a l C o n t e x t ( n u l l ) ; i n j e c t i o n T a r g e t . i n j e c t ( t , c r e a t i o n a l C o n t e x t ) ; i n j e c t i o n T a r g e t . p o s t C o n s t r u c t ( t ) ; r e t u r n t ; } J A V A
  99. @SvenRuppert 105/122 CDI explained by code 5 / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator p u b l i c c l a s s D e m o L o g i c P r o d u c e r { @ I n j e c t I n s t a n c e < D y n a m i c O b j e c t A d a p t e r F a c t o r y > d O A F I n s t a n c e ; @ I n j e c t C o n t e x t c o n t e x t ; @ P r o d u c e s @ D y n a m i c D e c o r a t o r T e s t p u b l i c D e m o L o g i c c r e a t e ( M a n a g e d I n s t a n c e C r e a t o r i n s t a n c e C r e a t o r ) { f i n a l D e m o L o g i c d e m o L o g i c = i n s t a n c e C r e a t o r . a c t i v a t e C D I ( n e w D e m o L o g i c ( ) { } ) ; f i n a l D y n a m i c O b j e c t A d a p t e r F a c t o r y d y n a m i c O b j e c t A d a p t e r F a c t o r y = d O A F I n s t a n c e . g e t ( ) ; f i n a l O b j e c t a d a p t e r ; i f ( c o n t e x t . o r i g i n a l ) { a d a p t e r = n e w O b j e c t ( ) ; } e l s e { / / k a n n h i e r b e l i e b i g k o m p l e x w e r d e n a d a p t e r = i n s t a n c e C r e a t o r . a c t i v a t e C D I ( n e w D e m o L o g i c A d a p t e r _ A ( ) ) ; } / / h i e r i n t e r f a c e n o t w e n d i g . . . s e e i n s i g h t r e t u r n d y n a m i c O b j e c t A d a p t e r F a c t o r y . a d a p t ( d e m o L o g i c , D e m o L o g i c . c l a s s , a d a p t e r ) ; } J A V A
  100. @SvenRuppert 106/122 CDI explained by code 6 / 7 CDI

    managed DynamicObjectAdapter - besserer Decorator p u b l i c c l a s s D y n a m i c O b j e c t A d a p t e r F a c t o r y { @ I n j e c t I n s t a n c e < C D I I n v o c a t i o n H a n d l e r > c d i I n v o c a t i o n H a n d l e r I n s t a n c e ; p u b l i c < T > T a d a p t ( f i n a l O b j e c t a d a p t e e , f i n a l C l a s s < T > t a r g e t , f i n a l O b j e c t a d a p t e r ) { f i n a l C D I I n v o c a t i o n H a n d l e r i n v o c a t i o n H a n d l e r = c d i I n v o c a t i o n H a n d l e r I n s t a n c e . g e t ( ) . a d a p t e r ( a d a p t e r ) . a d a p t e e ( a d a p t e e ) ; r e t u r n ( T ) P r o x y . n e w P r o x y I n s t a n c e ( t a r g e t . g e t C l a s s L o a d e r ( ) , n e w C l a s s [ ] { t a r g e t } , / / h i e r I n t e r f a c e n o t w e n d i g ! i n v o c a t i o n H a n d l e r ) ; } } J A V A
  101. @SvenRuppert 107/122 CDI explained by code 7a / 7c CDI

    managed DynamicObjectAdapter - besserer Decorator p u b l i c c l a s s M e t h o d I d e n t i f i e r { p r i v a t e f i n a l S t r i n g n a m e ; p r i v a t e f i n a l C l a s s [ ] p a r a m e t e r s ; p u b l i c M e t h o d I d e n t i f i e r ( M e t h o d m ) { n a m e = m . g e t N a m e ( ) ; p a r a m e t e r s = m . g e t P a r a m e t e r T y p e s ( ) ; } / / w e c a n s a v e t i m e b y a s s u m i n g t h a t w e o n l y c o m p a r e a g a i n s t / / o t h e r M e t h o d I d e n t i f i e r o b j e c t s p u b l i c b o o l e a n e q u a l s ( O b j e c t o ) { M e t h o d I d e n t i f i e r m i d = ( M e t h o d I d e n t i f i e r ) o ; r e t u r n n a m e . e q u a l s ( m i d . n a m e ) & & A r r a y s . e q u a l s ( p a r a m e t e r s , m i d . p a r a m e t e r s ) ; } p u b l i c i n t h a s h C o d e ( ) { r e t u r n n a m e . h a s h C o d e ( ) ; } } J A V A
  102. @SvenRuppert 108/122 CDI explained by code 7b / 7c CDI

    managed DynamicObjectAdapter - besserer Decorator p u b l i c c l a s s C D I I n v o c a t i o n H a n d l e r i m p l e m e n t s I n v o c a t i o n H a n d l e r { p r i v a t e M a p < M e t h o d I d e n t i f i e r , M e t h o d > a d a p t e d M e t h o d s = n e w H a s h M a p < > ( ) ; p r i v a t e O b j e c t a d a p t e r ; p r i v a t e O b j e c t a d a p t e e ; p u b l i c O b j e c t i n v o k e ( O b j e c t p r o x y , M e t h o d m e t h o d , O b j e c t [ ] a r g s ) t h r o w s T h r o w a b l e { i f ( a d a p t e d M e t h o d s . i s E m p t y ( ) ) { M e t h o d [ ] m e t h o d s = a d a p t e r . g e t C l a s s ( ) . g e t D e c l a r e d M e t h o d s ( ) ; f o r ( M e t h o d m : m e t h o d s ) { a d a p t e d M e t h o d s . p u t ( n e w M e t h o d I d e n t i f i e r ( m ) , m ) ; } } t r y { M e t h o d o t h e r = a d a p t e d M e t h o d s . g e t ( n e w M e t h o d I d e n t i f i e r ( m e t h o d ) ) ; i f ( o t h e r ! = n u l l ) { r e t u r n o t h e r . i n v o k e ( a d a p t e r , a r g s ) ; } e l s e { r e t u r n m e t h o d . i n v o k e ( a d a p t e e , a r g s ) ; } } c a t c h ( I n v o c a t i o n T a r g e t E x c e p t i o n e ) { t h r o w e . g e t T a r g e t E x c e p t i o n ( ) ; } } . . . J A V A
  103. @SvenRuppert 109/122 CDI explained by code 7c / 7c CDI

    managed DynamicObjectAdapter - besserer Decorator Mit diesem Pattern sind wir in der Lage die Unzulänglichkeiten des CDI Decorators auszugleichen.
  104. @SvenRuppert 110/122 CDI explained by code 7c / 7c CDI

    managed DynamicObjectAdapter - besserer Decorator Mit diesem Pattern sind wir in der Lage die Unzulänglichkeiten des CDI Decorators auszugleichen. Spätere Änderungen an dem Interface führen nicht dazu, dass alle Adapter angepasst werden müssen
  105. @SvenRuppert 111/122 CDI explained by code 7c / 7c CDI

    managed DynamicObjectAdapter - besserer Decorator Mit diesem Pattern sind wir in der Lage die Unzulänglichkeiten des CDI Decorators auszugleichen. Spätere Änderungen an dem Interface führen nicht dazu, dass alle Adapter angepasst werden müssen Alle Komponenten sind von dem verwendeten CDI-Container verwaltet
  106. @SvenRuppert 112/122 Cross Language Injection .. am Beispiel von Kotlin..

    c l a s s D e m o L o g i c K o t l i n ( ) { p u b l i c f u n w o r k O n S t r i n g ( ) : S t r i n g { r e t u r n " D e m o L o g i c K o t l i n " } } J A V A
  107. @SvenRuppert 113/122 Cross Language Injection .. am Beispiel von Kotlin..

    entweder : Adapter mit Delegator @ C D I N o t M a p p e d p u b l i c c l a s s D e m o L o g i c K o t l i n W r a p p e r i m p l e m e n t s D e m o L o g i c { p r i v a t e @ I n j e c t D e m o L o g i c K o t l i n k o t l i n ; p u b l i c S t r i n g w o r k O n S t r i n g ( ) { r e t u r n k o t l i n . w o r k O n S t r i n g ( ) ; } } J A V A
  108. @SvenRuppert 114/122 Cross Language Injection .. am Beispiel von Kotlin..

    oder mittels Producer direkt verfügbar machen @ C D I N o t M a p p e d p u b l i c c l a s s D e m o L o g i c K o t l i n P r o d u c e r { @ I n j e c t M a n a g e d I n s t a n c e C r e a t o r c r e a t o r ; / / @ I n j e c t D e m o L o g i c K o t l i n k o t l i n ; @ P r o d u c e s @ K o t l i n I m p l p u b l i c D e m o L o g i c c r e a t e ( ) { f i n a l D e m o L o g i c l o g i c = n e w D e m o L o g i c K o t l i n W r a p p e r ( ) ; r e t u r n c r e a t o r . a c t i v a t e C D I ( l o g i c ) ; } } J A V A
  109. @SvenRuppert 116/122 CDI und TDD ... kaskadierte MOCKS Service A

    injected Service B injected Service C Service A (mocked) injected Service B injected Service C
  110. @SvenRuppert 117/122 CDI und TDD ... kaskadierte MOCKS Service A

    injected Service B injected Service C Service A (mocked) injected Service B injected Service C Service A injected Service B (mocked) injected Service C
  111. @SvenRuppert 118/122 CDI und TDD ... kaskadierte MOCKS Service A

    injected Service B injected Service C Service A (mocked) injected Service B injected Service C Service A injected Service B (mocked) injected Service C Service A (mocked) injected Service B (mocked) injected Service C
  112. @SvenRuppert 119/122 CDI und TDD ... kaskadierte MOCKS Service A

    injected Service B injected Service C Service A (mocked) injected Service B injected Service C Service A injected Service B (mocked) injected Service C Service A (mocked) injected Service B (mocked) injected Service C beliebige Kombinationen können so dynamisch zusammen geschaltet werden.
  113. @SvenRuppert 120/122 finally at amazon.. my book with Dr, Heinz

    Kabutz Book about Reflection - part one Dynamic Proxies z.B. ...dynamic static proxies... ;-)