Dependency Injection für Domänenobjekte Implementierung eines Rich Domain Models mit Spring AOP Nils Wloka OPITZ CONSULTING Gummersbach GmbH Düsseldorf, 26.02.2009 Dependency Injection für Geschäftsobjekte Seite 1 Der Referent · · Nils Wloka Senior Architekt bei der OPITZ CONSULTING Gummersbach GmbH · · · · · Seit ca. 8 Jahren im Java-Umfeld tätig Schwerpunkt: JEE, Softwarearchitektur, Agile Methoden Mitautor von ,,Spring Praxishandbuch: Band 1" Autor für Fachmagazine Email: nils.wloka@opitz-consulting.de Dependency Injection für Geschäftsobjekte Seite 2 1 Es war einmal... Dependency Injection für Geschäftsobjekte Seite 3 Story 1: Warenkorb In einem dauerhaft gespeicherten Warenkorb sollen Produkte in unterschiedlicher Anzahl aufbewahrt werden können. Dependency Injection für Geschäftsobjekte Seite 4 Dependency Injection für Geschäftsobjekte Seite 5 Dependency Injection für Geschäftsobjekte Seite 6 2 Darf`s ein bisschen mehr sein? Dependency Injection für Geschäftsobjekte Seite 7 Story 2: Produkte zusammenfassen Im Warenkorb sollen gleiche Produkte zusammengefasst und als ein Eintrag geführt werden. Dependency Injection für Geschäftsobjekte Seite 8 Dependency Injection für Geschäftsobjekte Seite 9 Dependency Injection für Geschäftsobjekte Seite 10 3 Noch mehr... Dependency Injection für Geschäftsobjekte Seite 11 Story 3: Kundenlimit Produkte sollen dem Warenkorb nur dann hinzugefügt werden dürfen, wenn dadurch das Einkaufslimit des Kunden nicht überschritten wird. Dependency Injection für Geschäftsobjekte Seite 12 Dependency Injection für Geschäftsobjekte Seite 13 Dependency Injection für Geschäftsobjekte Seite 14 4 Bitte nicht das... Dependency Injection für Geschäftsobjekte Seite 15 Story 4: Rabatte Produkte sollen rabattiert werden. Dazu können Rabattstaffeln aus mit Mindestmengen verknüpften Prozentangaben gepflegt werden. Greift mehr als eine Rabattstaffel, soll der höchste Rabatt gewährt werden. Dependency Injection für Geschäftsobjekte Seite 16 Dependency Injection für Geschäftsobjekte Seite 17 Dependency Injection für Geschäftsobjekte Seite 18 5 Rich Domain Models Dependency Injection für Geschäftsobjekte Seite 19 Was ist passiert? · Anämisches Domänenmodell (siehe Fowler) · Verstoß gegen OO-Prinzipien (SoC, SRP, etc.) · Prozeduraler Stil Auswirkungen: · Schlechte Wartbarkeit · Bedeutung geht verloren Dependency Injection für Geschäftsobjekte Seite 20 Quellen: http://typicalprogrammer.com/?p=23 http://www.javaworld.com/javaworld/jw-09-2003/jw-0905toolbox.html http://www.codeinstructions.com/2008/08/getters-andsetters-are-evil.html Dependency Injection für Geschäftsobjekte Seite 21 Die Alternative... · Entwurf echter Modelle · Nachrichtenaustausch · Verkapselung Vorteile: · Erweiterbarkeit und Wiederverwendbarkeit · Testbarkeit der Geschäftslogik Dependency Injection für Geschäftsobjekte Seite 22 Dependency Injection für Geschäftsobjekte Seite 23 Dependency Injection für Geschäftsobjekte Seite 24 6 Jetzt nochmal... Dependency Injection für Geschäftsobjekte Seite 25 Story 4: Rabatte Produkte sollen rabattiert werden. Dazu können Rabattstaffeln aus mit Mindestmengen verknüpften Prozentangaben gepflegt werden. Greift mehr als eine Rabattstaffel, soll der höchste Rabatt gewährt werden. Dependency Injection für Geschäftsobjekte Seite 26 Dependency Injection für Geschäftsobjekte Seite 27 Was ist passiert? · Die Domäne benötigt Services · Lose Kopplung, aber wie? Die Lösung: · Mal wieder Dependency Injection Dependency Injection für Geschäftsobjekte Seite 28 7 DI für Geschäftsobjekte Dependency Injection für Geschäftsobjekte Seite 29 Das Geheimnis · · AspectJTM public pointcut objectCreation(Object someInstance) : initialization(*.new(..)) && this(someInstance); public pointcut deserialization(Object someInstance) : execution(Object *.readResolve()) && this(someInstance); aspectOf() als Factory-Methode für Aspekt-Singletons · · Dependency Injection für Geschäftsobjekte Seite 30 Der schnellste Weg -javaagent:spring-agent.jar @Configurable an Domänenobjekte · Basiert auf AnnotationBeanConfigurerAspect Dependency Injection für Geschäftsobjekte Seite 31 Dependency Injection für Geschäftsobjekte Seite 32 Dependency Injection für Geschäftsobjekte Seite 33 Funktioniert, aber... · @Configurable an Domänenobjekten · Wenig Kontrolle über den Konfigurationsprozess · Performanceeinbußen durch dynamische Methodenaufrufe Dependency Injection für Geschäftsobjekte Seite 34 Eigene Schnittstellen Zusätzlich: Domänenschnittstelle AbstractInterfaceDriven DependencyInjectionAspect factory-method="aspectOf" META-INF/aop.xml Dependency Injection für Geschäftsobjekte Seite 35 Dependency Injection für Geschäftsobjekte Seite 36 Dependency Injection für Geschäftsobjekte Seite 37 Falls auch das nicht reicht... AbstractDependencyInjectionAspect Abstrakte Pointcuts für Erzeugung, Deserialisierung, Pre-Konstruktor, etc. · Höchstmaß an Kontrolle · Für Randfälle gedacht (komplexe Deserialisierungsmechanismen, etc.) Dependency Injection für Geschäftsobjekte Seite 38 8 Zusammenfassung Dependency Injection für Geschäftsobjekte Seite 39 Rich Domain Models für echte Objektorientierung DI in Domänenobjekte ist möglich und sinnvoll Keine Angst vor AspectJ Dependency Injection für Geschäftsobjekte Seite 40 & Dependency Injection für Geschäftsobjekte Seite 41 Kontakt: Nils Wloka OPITZ CONSULTING Gummersbach GmbH nils.wloka@opitz-consulting.de Vielen Dank für Ihre Aufmerksamkeit ! Dependency Injection für Geschäftsobjekte Seite 42 Vertiefende Lektüre · Eric J. Evans Domain-Driven Design: Tackling Complexity in the Heart of Software Thomas Biskup, Rafael Stalitza, Sascha Steiger, Nils Wloka Spring Praxishandbuch: Band 2: Dynamisierung, Verteilung und Sicherheit (voraussichtlich 05/2009) Ramnivas Laddad SpringSource TeamBlog: New Improvements in Domain Object Dependency Injection Features http://blog.springsource.com/2008/01/23/new-improvements-in-domain-objectdependnecy-injection-feature/ · · Dependency Injection für Geschäftsobjekte Seite 43