Spring Framework Architektur

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.