Spring an einem einfachem Beispiel (Tutorial)

Klassendiagramm dieses Beispiels

Dieser Beitrag ist Teil einer (Tutorial-) Serie über die Einführung in das Spring Framework und stellt das Spring Framework an einem kleinen einfachem Beispiel vor.

Die Struktur des Projektes

Die verwendeten Frameworks und Werkzeuge sind hier beschrieben. Dieses Beispiel ist eine Konsolenanwendung, die den Service eines Taschenrechners aufruft. In diesem Beispiel werden die folgenden Technologien des Spring Frameworks vorgestellt:

  • Die Definition einer Spring Bean mit einem Interface über die XML Konfiguration des Spring Frameworks.
  • Die Verwendung von Spring Framework Utilities zur Validierung von Aufrufparametern.
  • Die Erstellung eines JUnit-Tests mit der Verwendung von Java Hamcrest.
  • Die Trennung der Test-Implementierung von der Produktiven-Implementierung.
  • Die automatisches Dependency Injection (Autowired) des Taschenrechners.
  • Die Verwendung von Logging.
  • Das Definieren von Spring Beans mit Annotationen und das Auffinden der Spring Beans mit einem Component scan.
  • Das Starten einer Konsolenanwendung.

Im folgendem Bild ist die Projektstruktur dargestellt.

Die Projektstruktur in Eclipse

Die Projektstruktur in Eclipse (© Frank Rahn)

Im folgendem Bild sind die benötigten Bibliotheken dargestellt. Das Maven Plugin wird hier nur für das Auflösen der Abhängigkeiten (Dependency) und das Downloaden der benötigten Bibliotheken verwendet.

Die benötigten Bibliotheken (Dependencies)

Die benötigten Bibliotheken - Dependencies (© Frank Rahn)

Update

Das Maven Skript wurde vervollständigt und kann auch zum Builden ( $ mvn clean package) der Anwendung verwendet werden. Mit $ mvn eclipse:clean eclipse:eclipse werden die Konfigurationsdateien für Eclipse neu erstellt – sie sind aber auch noch im Repository. Die Anwendung kann mit $ mvn exec:java ausgeführt werden.

Die Literaturempfehlungen für dieses Beispiel

Der Service eines Taschenrechners

Zunächst wird die Schnittstelle des Services definiert. Diese erhält vorerst zwei Methoden um Zahlen zu addieren. Für eine Einführung in das Spring Framework ist dieser minimale Funktionsumfang dieser Schnittstelle ausreichend.

Hier die Implementierung des Services mit den ersten Prüfungen.

  • In der Zeile 19 und 36 wird eine Prüfung mit Mitteln Assert.notNull(summands) des Spring Frameworks durchgeführt. Wenn der Summand null ist, wird die Ausnahme IllegalArgumentException mit dem angegebenen Text als Nachricht geworfen.

Diese Modul wird mit einer XML basierenden Konfiguration aufgebaut.

  • In der Zeile 15 wird für den Taschenrechner ein Alias definiert, mit dem der Taschenrechner zusätzlich aufrufbar ist.

Der Test mit JUnit

Die JUnit Tests liegen im Source-Verzeichnis src/test mit einer identischen Paketstruktur, wie unter src/java. Im folgendem Quelltext ist ein JUnit Test für die Implementierung des Taschenrechner dargestellt.

  • In der Zeile 17 wird eine Annotationen für die Konfiguration verwendet, diese lädt die Datei SimpleCalculatorTest-context.xml im gleichen Verzeichnis wie die Klasse SimpleCalculatorTest.
  • Durch die Angabe der Annotation in Zeile 20 wird im Attribut calculator durch das Spring Framework eine Instanz der Implementierung des Services injiziert.
  • In der Zeile 35 wird angegeben, dass dieser Test nicht fehlschlägt, wenn die Ausnahme IllegalArgumentException geworfen wurde.

Die folgende Konfigurationsdatei des Tests importiert nur die Konfigurationsdatei des Taschenrechners.

Bei diesem Test wurde die Bibliothek Hamcrest verwendet. Diese Bibliothek verbessert die Ausgabe eines Fehlers.

Im folgendem Beispiel wird ein Fehler mit den Standard-Anweisungen von JUnit erzeugt.

Im folgendem Beispiel wird ein Fehler mit den Anweisungen von JUnit in Verbindung mit Hamcrest ausgelöst.

Die Anwendung mit Logging

Ein Anwendung, die das Ausführen des Taschenrechners ermöglicht.

  • Dabei wird in der Zeile 18 ein Logger mit der Simple Logging Facade for Java (SLF4J) erzeugt, der dann in den Zeilen 31 und 34 verwendet wird.
  • In der Zeile 21 wird vom Spring Framework eine Instanz des Taschenrechners in das Attribut calculator injiziert.

Die zugehörige XML Konfiguration. Diesmal wird das Package de.rahn.app hierarchisch nach Spring Beans gescannt (Zeile 18). Diese werden durch die Annotation @Component erkannt.

Der Starter, eine Konsolenanwendung, initialisiert die gesamte Anwendung (Zeile 15) und führt sie aus (Zeile 21).

Zum Abschluss die XML Konfiguration zum Einstieg in die Anwendung.

  • Diese ist im Verzeichnis META-INF/spring abgelegt und verweist in den Zeilen 15 und 16 auf die eigentlichen Module.

Bei anderen Arten von Anwendungen ändert sich der Name der XML Konfigurationsdatei, wie z. B. bei Webanwendungen in context-web.xml. So können mehrere von diesen Konfigurationen parallel nebeneinander liegen. Zusätzlich werden in diesem Verzeichnis allgemeine technische Konfigurationen, wie z. B. Datenbankinformationen, die von mehreren Modulen verwendet werden, abgelegt. Dadurch kann ein hoher Grad an Wiederverwendung erreicht werden.

Zum Abschluss das resultierende Klassendiagramm (UML) zu diesem Beispiel.

Klassendiagramm dieses Beispiels

Klassendiagramm dieses Beispiels (© Frank Rahn)

Der Quellcode und Download des Beispiels

Quellcode ansehen bei GitHub:
Spring an einem einfachem Beispiel

Download einer ZIP-Datei von GitHub:
Spring an einem einfachem Beispiel

Die Maven Befehle

Eclipse Konfiguration neu erzeugen: $ mvn eclipse:clean eclipse:eclipse

Anwendung bauen: $ mvn clean install

Anwendung ausführen: $ mvn initialize exec:exec

Update am 28.09.2012

Es wurden folgende Änderungen an allen Projekten vorgenommen.

  1. Die Projekte wurden aus meinem lokalen Apache Subversion Repository in meine öffentlichen GitHub Repositories verschoben.
  2. Die folgenden typischen Anpassungen an Git wurden an allen Projekten durchgeführt.
    • .directory gelöscht
    • .gitignore hinzugefügt
    • README.md hinzugefügt
    • COPYRIGHT.md hinzugefügt
    • In jedem Repository wurde für jeden Beitrag der Serie ein Branch angelegt.
      • develop-spring-an-einem-einfachen-beispiel
      • develop-spring-mit-aop
      • develop-spring-mit-jpa-und-hibernate
      • develop-spring-mit-einer-einfachen-webanwendung
      • develop-spring-mit-einer-webanwendung-mit-jpa-und-validierung
      • develop-spring-security-mit-einer-webanwendung
      • develop-spring-mit-restful-webservice

Updates von 06.10.2012 bis zum 14.10.2012

Es wurden folgende Änderungen an allen Projekten vorgenommen.

  1. Aktualisierung des OpenJDK auf die Version 1.7.0.
  2. Aktualisierung der Entwicklungsumgebung Eclipse auf die Version 4.2.1.
    Die benötigten Plugins aus dem Eclipse Marketplace:

  3. Aktualisierung der Datei pom.xml:
    • Anpassungen an die OpenJDK Version
    • GitHub Einträge (SCM und URL) hinzugefügt
    • Aktualisierung der Libraries auf aktuellerer Versionen (z. B. Spring Version 3.1.2.RELEASE, Hibernate Version 4.1.7.Final, JUnit Version 4.10, mockito Version 1.9.0, …)
      Die genaueren Versionen bitte aus den jeweiligen pom.xml auf GitHub entnehmen.

Frank Rahn

Frank Rahn ist Softwarearchitekt. Er unterstützt bei der Konzeption von Softwarearchitekturen mit Java-Technologie. Folge Sie ihm auf Facebook, Twitter oder Google+.

Benötigen Sie Unterstützung? Kontaktieren Sie ihn.

Hat Ihnen dieser Beitrag gefallen? Wir würden uns über Ihren Kommentar freuen! Bitte verwenden Sie Ihren bürgerlichen Namen und eine E-Mail-Adresse mit Gravatar.

Letzte Artikel von Frank Rahn (Alle anzeigen)

0 Kommentare

Dein Kommentar

Want to join the discussion?
Feel free to contribute!

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.