Spring Framework Architektur
Ein Einsatz von Spring ist aktuell in fast jedem Bereich einer Anwendung möglich.
Spring vereinfacht die Entwicklung von Webservices, bietet ein einheitliches Testkonzept,
ermöglicht eine sehr einfache Sessionverwaltung für Datenbankzugriffe und lässt sich mit
geringem Aufwand mit reinen J2EE-Frameworks wie Struts2 verbinden.
Trotz des umfangreichen
Einsatzgebietes von Spring ist sein architektonischer Ansatz übersichtlich und leicht
verständlich. Häufig wird genau diese Tatsache als eine der großen Stärken des
Spring-Frameworks genannt.
Die fünf Elemente von Spring bilden die Bereiche:
Spring-ORM
Spring-AOP
Spring-Core
Spring-Testing
Spring-Web
Abbildung 19 demonstriert die oben genannten Bereiche mit ihren Abhängigkeiten:
Abbildung 19: Säulen des Spring-Framework
Quelle: Eigene Darstellung
Als Basis der Säulen dient das „Spring-Core“-Paket. Dieses beinhaltet
den Spring-„Inversion of Control Container“ (IOC). Dieser Container bietet
die Möglichkeit, Abhängigkeiten von Klassen zur Laufzeit zu erstellen.
Dabei wird eine XML-Konfigurationsdatei ausgewertet, so dann werden mittels der
SUN-Reflection-API entsprechende Java-Objekte erzeugt. Dieses Prinzip wird auch
als das „Hollywood-Prinzip“ bezeichnet: „Don’t call us, we call you.“.
Abgeleitet ist diese Bezeichnung von dem im Film- und Showbusiness üblichen
Verhalten erfolgreicher Manager, die nicht von ihren Klienten angerufen werden
wollen, sondern sich selbst bei Bedarf melden. Auf die Java-Objekte übertragen
bedeutet dies, dass in keiner Klasse eine Instanzierung mittels des „new-operator“
erfolgt. Vielmehr werden benötigte Objekte über Setter-Methoden zur Laufzeit gesetzt.
Dies ermöglicht eine lose Kopplung von Objekten und den flexiblen Austausch von
entsprechenden Implementierungen. Zudem müssen keine Änderungen an den eigentlichen
Java-Klassen erfolgen. Die in der obigen Abbildung aufgeführten Säulen nutzen das Prinzip
des IOC und schaffen damit ein einheitliches Konfigurationsmanagement für alle Bereiche
innerhalb einer Anwendung. Die innerhalb des IOC-Containers definierten Klassen
werden auch als Spring-Beans bezeichnet.
Abbildung 20 zeigt die
Spring-Bean-Konfiguration eines Services, der mittels des Strategy-Patterns auf ein
DAO zugreift:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<!-- UserService -->
<bean id="benutzerService" class="StandardBenutzerService">
<property name="benutzerDAO">
<ref bean="benutzerDAO" />
</property>
</bean>
<!-- BenutzerDAO -->
<bean id="benutzerDAO" class="HibernateBenutzerDAO">
<property name="sessionFactory">
<ref local="sessionFactory" />
</property>
</bean>
</beans>
Abbildung 20: Spring-Beans-Konfiguration
Quelle: Eigene Darstellung
Der Begriff Spring-Bean ist mittlerweile zu einem Standard gereift
und als ganzheitliches Architekturkonzept anerkannt.
Eine definierte Spring-Bean kann zur Laufzeit über eine Instanz des
IOC-Containers geladen werden. Abbildung 21 demonstriert, wie ein
Objekt vom Typ „StandardBenutzerService“ mittels des IOC-Containers geladen wird:
// Spring IOC-Container mittels Bean-Konfiguration erzeugen
ApplicationContext context = new ClassPathXmlApplicationContext(
new String[] {"beans.xml"});
// Objekt aus dem Container holen
StandardBenutzerSerivce service =
(StandardBenutzerSerivce)context.getBean("benutzerService");.
Abbildung 21: Auslesen einer Spring-Bean
Quelle: Eigene Darstellung
Mittels der Spring-eigenen Klasse „ApplicationContext“ erfolgt der Zugriff
auf den IOC-Container. Über die Methode „getBean“ kann eine beliebige Bean
anhand der konfigurierten ID ausgelesen und verwendet werden. Für die Verwendung
des konkreten Typs muss ein Casting erfolgen, da die Methode „getBean“ ein Objekt
vom Typ „java.lang.Object“ zurückliefert.