Service Architekturen – mit Spring und Hibernate

Sonntag, 21. August 2011 von  
unter Fachartikel Architektur

Zielgruppe dieses Blog-Eintrags sind Java Entwickler mit Spring Kenntnissen, die bereits Erfahrungen mit Persistenz Frameworks wie Hibernate haben, oder diese und ähnliche Erfahrung ergänzen möchten, als auch Architekten, die Erfahrung mit dem Applikations-Entwurf unter Verwendung der verwendeten Design Patterns und Technologien (Spring, Hibernate) haben, oder diese Erfahrungen ergänzen möchten.

Neulich fiel mir die Mai-Ausgabe des JavaMagazins aus dem Jahr 2007 in die Hände, in der vor allem der Artikel mit dem Titel „Frühlingsgefühle jetzt&hier“ von Eberhard Wolff meine volle Aufmerksamkeit auf sich zog, weshalb hieraus als Einleitung für diesen Blog-Eintrag die ersten zehn Sätze komplett zitiert werden sollen:

Technologien sind keine Architekturen. Spring ist ein Framework, also auch nur eine Technologie und sagt daher noch nichts über die Architektur der Anwendung aus. Dennoch hat die Verwendung von Spring Auswirkungen auf die Strukturierung der Software, sodass man durchaus allgemeine Aussagen über Spring-Anwendungen treffen kann. Diese Aussagen sind zum größten Teil über Spring hinaus auf Enterprise-(Java-)Anwendungen anwendbar.

Der Einfluss von Spring auf die Architektur hängt mit der besonderen Struktur von Spring zusammen.
Spring bietet drei verschiedene Technologien und genau diese Kombination macht das Framework so einzigartig:
AOP (Aspektorientierte Programmierung) bietet die Möglichkeit, Cross Cutting Concerns (Querschnittsbelange) an einer Stelle zentralisiert zu implementieren.
– Die portable Service-Abstraktion bietet eine Vereinheitlichung und Vereinfachung vieler Java-APIs unter anderem durch ein einheitliches und einfacheres Exception-Konzept und durch die automatisierte Freigabe von Ressourcen.
– Mithilfe von Dependency Injection (DI) kann man Anwendungen aus einzelnen Objekten zusammenstellen.

Dem ist erstmal nichts hinzuzufügen. Zur Erklärung des Einsatzes von AOP wird auf bereits existierende Einträge in diesem Blog zum Thema AOP verwiesen. Ebenso wird zur Erklärung des Einsatzes von Spring und Hibernate auf bereits existierende Einträge in diesem Blog zum Thema Spring und Hibernate verwiesen.

Spring verwendet zur Instanziierung der Beans aus den Bean Definitionen (z.B. per applicationContext.xml) weder das AbstractFactory Pattern (oft in Verbindung mit dem TransferObject Pattern verwendet) noch das FactoryMethod Pattern, sondern eine von mehreren möglichen Bean Factories nach dem Prinzip der „Inversion of Control“ (IoC), bevor die Objekte als Attribute (z.B. als Delegaten) in ihre Ziel-Objekte gesetzt, also per Dependency Injection injectet werden können.

Das folgende UML Klassendiagramm soll beispielhaft eine saubere Service Architektur darstellen, umsetzbar mit Spring und Hibernate.

Dabei verwendete Design Patterns sind, z.B.:

– das DAO Pattern
– das Strategy Pattern
– das Facade Pattern
– das OpenSessionInView Pattern

OpenSessionInView Pattern: (auch „OpenSessionInView_ExtendedSession“ Pattern genannt)

Um ein Problem in Form einer org.hibernate.LazyInitializationException zu vermeiden, welches im Zusammenhang mit „Lazy Loading“ entstehen kann, wird das Pattern in Form eines von Spring angebotenen „OpenSessionInViewFilters“ (ServletFilter) angewendet.
Mit Hilfe dieses ServletFilters wird die Lebensdauer des von Hibernate bereitgestellten Proxy Objekts, welches sonst nur die Lebensdauer der HibernateSession im Rahmen eines DAO-Methodenaufrufs hätte, auf die Lebensdauer des gesamten HTTPRequest ausgedehnt.

Der OpenSessionInViewFilter öffnet zu Beginn des HttpRequests eine HibernateSession und schließt diese erst wieder nach dem Commit der „managed HibernateSession“. Die HibernateSession wird an den Request-ausführenden Thread gebunden und ist bis zur commiteten „managed HibernateSession“ auch über mehrere DAO-Aufrufe gültig, wodurch die beschriebene Exception entfällt.

Zu beachten ist noch der Flush-Modus, der den Zeitpunkt steuert, an dem Hibernate die Objekte in der Hibernate-Session mit der Datenbank synchronisiert, wobei Hibernate die HibernateSession standardmäßig im Flush-Modus FlushMode.NEVER öffnet. Dies bedeutet keine automatische Übernahme der geänderten persistenten Objekte in die Datenbank nach Beendigung des Requests. Nur Änderungen im Rahmen einer Transaktion oder ein expliziter flush() -Aufruf bewirken einen Commit der Persistenz-Objekte.
Das Gegenteil wäre der Flush-Modus FlushMode.AUTO, der eine automatische Übernahme der geänderten persistenten Objekte in die Datenbank nach Beendigung des Requests bewirkt.

Der Entwurf und das Design einer Spring Anwendung unter Verwendung von Hibernate und einer oder mehrerer WebService-Schnittstellen ist natürlich noch keine Service-orientierte Architektur (SOA), aber ein erster Schritt in die richtige Richtung. Denn aus welchen Komponenten besteht eine Service Architektur denn, wenn nicht aus (Web-)Services. Serviceorientierte Architekturen (SOAs) mit Spring und weiteren Technologien werden in einem extra Blog-Eintrag besprochen.

Als Anwendungsempfehlung wird für Web-Applikationen, z.B. im Rahmen serviceorientierter Architekturen, die Situation genannt, das Flush/Commit-Verhalten völlig transparent zu halten und die volle Verantwortung über die transaktionale Kontrolle dem Transaktionsmanagement (Transaktionen starten, unterstützen, commiten) im Service-Layer zu überlassen.

Aktiviert wird der „OpenSessionInViewFilter“ logischerweise klassisch per -Tag in der web.xml einer Web-Applikation:
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate.support.OpenSessionInViewFilter</filter-class>
</filter>

Die Spring- und Hibernate Beispiel-Applikation der Service-Architektur unter Verwendung der genannten Design Patterns befindet sich hier.

Als zu verwendende Technologien für die Umsetzung dieser Architektur können empfohlen werden:

– Hibernate
– Spring (VMware, springsource.com)
– JAX-WS, Apache CXF, JBoss RESTEasy
– Tomcat, JBoss

Für die Arbeit mit den genannten Technologien kann auch ein Beispielprojekt verwendet werden, welches schnell mittels Dashboard (Spring Template Project) angelegt werden kann. Hierfür werden benötigt: Als flexible Entwicklungsumgebung die Spring Source Tool Suite 2.6.0. SR1 der JEE 64bit Version [Download von: http://www.springsource.com/downloads/sts], weiterhin als Buildsystem Maven in einer Version höher als 2.2.1. Nach erfolgreichem Anlegen befindet sich innerhalb des Workspaces dann ein konfigurierbares und ausführbares Projekt mit den relevanten Maven Dependencies.

Alle in diesem Blog-Eintrag verwendeten Beispiele finden sich übrigens hier.

Quelle dieses Blog Eintrags sind die bei SpringSource frei verfügbare aktuelle Spring Referenz, verschiedene Spring Bücher aus dem Apress-Verlag, das Buch mit dem Titel “Spring 3″ von Eberhard Wolff aus dem dpunkt Verlag, das Buch “Spring im Einsatz“ von Craig Walls aus dem Hanser Verlag, das Buch “Hibernate” von Sebastian Hennebrüder, das Buch “Spring & Hibernate” aus dem Hanser Verlag, sowie eigene Erfahrungen mit dem Spring Framework und dem Hibernate Framework.

Kommentare

16 Kommentare zu “Service Architekturen – mit Spring und Hibernate”

  1. Von Services – mit Spring und JPA Implementierungen : binaris informatik GmbH am Montag, 24. Oktober 2011 02:03

    […] praktische Erklärungen zu Service-Architekturen mit Spring, Hibernate als JPA Implementierung und WebServices finden sich hier in diesem […]

  2. Von Services – mit Spring, JPA und SOAP : binaris informatik GmbH am Mittwoch, 9. November 2011 09:42

    […] Zu üblicherweise für z.B. mit Hilfe von JPA Implementierungen, wie Hibernate, umgesetzte Services …. Ein Blog-Eintrag zu Hibernate und Transaktionen findet sich hier in diesem Blog. JPA und Transaktionen werden in einem extra Blog-Eintrag besprochen. […]

  3. Von Web Frameworks – GWT Apps an Hibernate anbinden : binaris informatik GmbH am Montag, 20. Februar 2012 14:42

    […] Blog gibt, darf auf diese Einträge verwiesen werden, beispielhaft wird deshalb auf den Beitrag “Service Architekturen – mit Spring und Hibernate” […]

  4. Von Architekturen – Design Patterns und Technologien : binaris informatik GmbH am Sonntag, 24. Juni 2012 18:43

    […] sich zum SOA Consultant entwickeln möchte, findet hier Hinweise dazu. Beispielhaft gibt es über “Service Architekturen mit Spring und Hibernate“ bereits einen Blog-Eintrag in diesem […]

  5. Von Eclipse RCP – OSGi, Equinox und SOA : binaris informatik GmbH am Sonntag, 30. September 2012 13:37

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  6. Von Services mit OSGi, Spring DM, Java : binaris informatik GmbH am Sonntag, 24. Februar 2013 17:46

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  7. Von Services – mit Spring Dynamic Modules, Eclipse Blueprint : binaris informatik GmbH am Sonntag, 24. März 2013 20:26

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  8. Von Services – mit Spring Dynamic Modules, OSGi : binaris informatik GmbH am Sonntag, 28. April 2013 20:57

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  9. Von Services – mit Spring, Spring DM und OSGi : binaris informatik GmbH am Sonntag, 30. Juni 2013 22:30

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  10. Von Services – mit Spring DM, Collections und Java : binaris informatik GmbH am Sonntag, 30. Juni 2013 22:36

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  11. Von Services – mit Spring DM Web und Tomcat : binaris informatik GmbH am Donnerstag, 1. August 2013 22:25

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  12. Von Services – mit Spring DM, OSGi, Tomcat, Spring MVC : binaris informatik GmbH am Samstag, 31. August 2013 23:55

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  13. Von Services – Spring, SOAP, Spring Remoting : binaris informatik GmbH am Samstag, 23. November 2013 12:57

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier und hier, weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt wird. Der Begriff […]

  14. Von Services – mit Spring MVC, Spring Remoting : binaris informatik GmbH am Montag, 23. Dezember 2013 20:49

    […] und die vorhandenen Design Patterns gibt es bereits bestehende Blog-Einträge in diesem Blog hier, hier,hier und hier weshalb das Thema in diesem Blog-Eintrag nicht weiter erklärt […]

  15. Von Services – mit Hibernate 4, Vaadin 6, JBoss 7 : binaris informatik GmbH am Freitag, 28. Februar 2014 22:13

    […] von Persistenz-Frameworks, wie z.B. Hibernate. Über Services mit JPA und Hibernate und Service-Architekturen mit Hibernate gibt es bereits Blog-Einträge in diesem Blog. Da Hibernate und der JBoss genauso wie das […]

  16. Von Architekturen – mit Spring CDI, JPA, JBoss, JavaEE : binaris informatik GmbH am Dienstag, 1. Juli 2014 22:47

    […] Über Hibernate und JPA gibt es bereits ein paar Blog-Einträge in diesem Blog hier, hier, und hier. […]

Einen Kommentar hinzufügen...

Sie müssen registriert und angemeldet sein um einen Kommentar zu schreiben.