Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

Spring Framework Grundkurs

Pointcuts

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Um Aspekte an den richtigen Orten zu platzieren, ist es unabdingbar, diese Orte korrekt spezifizieren zu können. Pointcuts erlauben es auf verschiedene Art und Weise, den eigenen Code zu referenzieren.

Transkript

Pointcuts lassen sich auf viele verschiedene Arten und Weisen definieren. So ist es also möglich, Methoden nur dann mit einem Aspekt zu versehen, wenn sie ganz bestimmte Anforderungen erfüllen. Wie Sie genau solche Anforderungen spezifizieren können, zeige ich Ihnen im Verlauf dieses Videos. Zunächst einmal sind die verschiedenen Ausdrucksarten zu unterscheiden, beginnend mit der am meist genutzten execution(). Diese greift immer dann, wenn eine bestimmte Methode ausgeführt wird. Die Methode als solches wird also komplett mit der gesamten Referenz spezifiziert. Mit dem Ausdruck within() gibt man an, ob der ausgeführte Code der Methode zu einer bestimmten Klasse oder Typ gehört. Mit dem Ausdruck args() gibt man genau die Methoden an, die eine bestimmte Verkettung von Argumenten haben, d. h. also beispielsweise, wenn diese zwei Strings als Argument haben. Mit der Anweisung this() spezifiziert man, dass das Zielobjekt, bzw. dessen this()-Angabe von einem bestimmten Typ ist. Mit der Angabe von target() gibt man einen bestimmten Typ eines Objekts an. Was ist nun der Unterschied zwischen within(), target() und this()? Within() würde man immer dann anwenden, wenn man genau weiß, der auszuführende Code der betroffen ist, steht exakt in einer Klasse und nirgendwo in der Vererbungshierarchie. Target() würde man immer dann verwenden, wenn man weiß, der Code der auszuführen ist bzw. der von der Advice betroffen sein soll, liegt irgendwo in der Vererbungshierarchie eines bestimmten Typs oder auf dem Bildtyp selbst. This() würde man immer dann anwenden, wenn man genau weiß, dass aufgrund von Proxyvorgängen so wie es in Introductions im Spring Framework üblich ist bestimmte Typen auf ein anderes Objekt drauf geschrieben werden, d. h. wenn der Typ erst zur Laufzeit bekannt ist. Lassen Sie uns nun konkret ein paar Beispiele dazu sehen. Zunächst einmal der Aufruf von execution() Execution() gibt immer die Sichtbarkeit als Erstes, dann das Ziel und die möglichen Parameter, ist damit also auch am mächtigsten von der Angabe. Mit der Anweisung this() spezifiziert man, dass das Zielobjekt bzw. dessen this()-Bezug von einem bestimmten Typ ist, d. h. also jedes Objekt, das nun von Spring erzeugt wird, wird automatisch mit dem Advice-Code angewiesen. Ein andere Beispiel hier ist nun, dass man die Sichtbarkeit mit Wildcard deklariert, sie also egal ist, dann alle Packages unter "eu.janietz" betrifft und dort alle Methoden. Weiterhin sind die Argumente egal, deklariert durch "Punkt-Punkt" Zu guter Letzt kann man auch alle get-Methoden betreffen. Dafür nimmt man den Anfangstext der Methode, der immer gleich ist bei einem Getter und deklariert den Rest mit Wildcard. Die Angabe von within() ist nun deutlich einfacher. Prinzipiell braucht man nicht mehr, als lediglich den Typ. Auch dieser kann, wie vorher gesehen, mit Wildcards verwendet werden. Würde man nun ausschließlich within() benutzen und ein bestimmtes Package angeben und eine Wildcard, wären alle Klassen, die unter diesem Package sind und deren Methoden betroffen. Eine weitere Variante wäre es auch alle Sub-Packages anhand der doppelten Puntk-Notation zu betreffen. Als nächstes gäbe es noch this(). This() nimmt ähnlich wie within() nur den Typ an. Als Beispiel könnte man nun ein bestimmtes Interface angeben. Und dieses Interface muss im Rahmen von Proxying-Prozessen, so wie einer Introduction auf das Objekt angewendet worden sein. Schließlich bei target() ist das Prinzip ähnlich wie bei within() und this(), man gibt lediglich den Typ an. Hier ist es wichtig, dass der Typ schon initial deklariert wurde und sich in der Vererbungshierarchie befindet. Mit args() ist es dann noch möglich. sich explizit verschiedene Typen zu spezifizieren, die in den Argumenten stehen müssen, z. B. String. Damit wären automatisch alle Methoden betroffen, die einen String entgegennehmen. Um nun den größten Nutzen aus diesen Angaben ziehen zu können, ist es auch möglich, diese logisch zu kombinieren. Dafür gibt es wie üblich in der Booleschen Logik auch Operatoren. Diese sind zunächst einmal "und-und", das logische "Und", damit müssten also beide Kriterien zutreffen Mit dem logischen "Oder" müssten zwei verschiedene Kriterien zutreffen. Und mit der logischen Umkehrung müsste all das zutreffen, was vorher nicht betroffen war. Gerade bei der logischen Umkehrung muss man vorsichtig sein, da man eventuell zu viele Dinge betrifft. Es ist auch möglich, vorher definierte Pointcuts mit diesen Operationen zu vergleichen. Lassen Sie mich nun das Ganze noch anhand eines praktischen Beispiels illustrieren. Zunächst einmal ist es notwendig, dass alle wichtigen Abhängigkeiten zur Verfügung stehen. Diese stehen in der Maven pom.xml. Wichtig ist das AOP-Framework, Spring Context selbst und AspectJ. Als nächstes muss die korrekte Spring-Konfiguration vorgenommen worden sein. Diese beinhaltet die Anweisung von AspectJ Autoproxy und den Component-Scan um automatisch Beans zu initialisieren. In der Main-Klasse wird nun der Kontext initialisiert der HelloWorldService abgerufen und dann auf drei verschiedene Arten und Weisen eine String-Nachricht abgefragt. Ich führe das Ganze nun zunächst aus und sehe an der Stelle mehrere Aussagen. Einerseits "Hello, World!", "Hello from Base!" und "Hello from Proxy!" Um nun zu verstehen, was an dieser Stelle passiert, , ist es wichtig nachzuschauen, wo die konkreten Pointcuts stehen. Diese stehen in diesem Fall im PointcutAspect. Zunächst einmal ist deklariert, dass alle get-Methoden betroffen sind. Weiterhin gibt es die Möglichkeit via target() die bestimmte HelloWorldService abzufragen, via within() die HelloWorldService abzufragen und via this() um das Proxy-Interface abzufragen. Mit der ersten Abfrage die darin resultiert, dass "Target Advice ausgeführt" da steht, wird überprüft, dass einerseits eine get-Methode betroffen ist und andererseits HelloWorldService, also das Target HelloWorldService ist. Das funktioniert immer genau dann, wenn "Hello, World!" da steht und wenn "Hello from Base!" da steht. Konkret heißt das also, der HelloWorldService hat einerseits die getMessage-Methode, die er selbst implementiert und er erweitert HelloWorldBase. In HelloWorldBase steht getBaseMessage und "Hello from Base!" Im ersten Fall, also normal nur HelloWorldService und getMessage, werden also alle drei Advice-Arten getriggert. Das kommt daher, dass das Target einerseits HelloWorldService ist, das bedeutet andererseits auch, dass die Methode aktuell unter dem HelloWorldService liegt direkt und nicht in der Base und dass weiterhin der HelloWorldService Proxy-Interface implementiert. Im zweiten Fall wird nun also die Methode getBaseMessage, die ursprünglich von HelloWorldBase stammt ausgeführt. Hier treffen nur noch "Target Advice" und "This Advice" zu. Der Grund warum within() nicht mehr stattfindet ist, dass die Methode schlicht und einfach nicht unter HelloWorldService liegt sondern unter HelloWorldBase. Im letzten Fall trifft keines mehr dieser Advices zu, denn letztendlich wird beim Aufruf des Proxy-Interfaces die ProxyInterfaceImpelementation genutzt und dementsprechend trifft keine dieser Angaben mehr zu. Die Methode getProxyMessage befindet sich in der Implementierung in der ProxyInterfaceImplementation. Sie haben nun also gesehen, wie man durch verschiedene Kombinationen von Pointcuts Aspekte für unterschiedlichste Szenarien einsetzen kann.

Spring Framework Grundkurs

Steigen sie zum Java-Champion auf und meistern Sie den Umgang mit dem Spring Framework.

2 Std. 4 min (20 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Spring Framework Spring Framework 3
Exklusiv für Abo-Kunden
Erscheinungsdatum:24.09.2014

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!