Spring mit AOP (Tutorial)

Dieser Beitrag ist Teil einer (Tutorial-) Serie über die Einführung in das Spring Framework und beschreibt das Arbeiten mit AOP im Spring Framework.

Die Struktur des Projektes

Dieses Beispiel baut auf dem vorherigem Beispiel Spring an einem einfachem Beispiel in der Version 1.x auf. 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 eines Aspektes mit Advices und Join Points.
  • Die XML Konfiguration eines Aspektes im Spring Framework.
  • Die Konfiguration des Loggings.

Im folgendem Bild sind die benötigten Bibliotheken dargestellt.

Die benötigten Bibliotheken (Dependencies)

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

Die Literaturempfehlungen für dieses Beispiel

Der Aspect

Zunächst definieren wir eine einfache Spring Bean Trace (Aspect). Diese Klasse definiert ein paar Methoden (Advices), die Vor, Nach bzw. Um den Aufruf der Zielmethode (Join Point) gesetzt bzw. ausgeführt werden.

Die XML Konfiguration für das AOP Modul.

Die notwendige Erweiterungen am Projekt

Die XML Konfiguration, für das vorherige Beispiel Spring an einem einfachem Beispiel, zum Einstieg in die Anwendung ist

  • um die AOP Beans in Zeile 23
  • und das Enabling des AspectJ Supports in Zeile 5, 9 und 18 zu erweitern.

Der Aspekt wird hier aktiviert, weil er Applikationsspezifisch eingesetzt wird.

  • Der Aspekt wird ab Zeile 26 definiert.
  • Der Pointcut ist in Zeile 28 definiert und enthält alle Methoden der Implementierung des Services. Der Pointcut wird in den Zeile 31 bis 33 den Advices zugewiesen.
  • In Zeile 27 wird das Spring Bean referenziert, welches die Implementierung des Aspekts bereitstellt.
  • In Zeile 18 und 26 wurde proxy-target-class="true" gesetzt. Dadurch wird nicht der Dynamic Proxy-Mechanismus des JDK’s verwendet, sondern mit dem Generator CGLIB Ableitungen generiert. Diese abgeleiteten Klassen werden mit zusätzlicher Funktionalität zur Laufzeit bzw. Ladezeitpukt der Klasse generiert. Bei der Verwendung von JDK Proxies muss darauf geachtet werden, dass die Spring Beans, auf die Aspekte angewendet werden, auf jeden Fall eine Interface definieren müssen. Ansonsten muss CGLIB verwendet werden.

Für die Ausgaben des Aspekts müssen einige Erweiterungen an der log4j Konfiguration durchgeführt werden.

  • Diese sind in Zeile 17 bis 19 zu finden.

Die Ausgaben

Hier die Ausgabe der Konsole von Eclipse ohne AOP.

Hier die Ausgabe der Konsole von Eclipse mit AOP.

  • Die Ausgaben durch die Advices erscheinen ab der Zeilen 7 bis 41, dabei ist die Zeile 11 (vorher in Zeile 6) noch aus der Anwendung.
  • In der alten Stacktrace Ausgabe ab Zeile 42 sind die Änderungen durch das AOP sichtbar.

Der Quellcode und Download des Beispiels

Quellcode ansehen bei GitHub:
Spring mit AOP

Download einer ZIP-Datei von GitHub:
Spring mit AOP

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.