2014-12-20 10 views
6

Say Service ruft die Dao-Klasse auf, auf die der Protokollierungsaspekt (Annotation) angewendet werden muss. Ich frage mich, wie Aspekte tatsächlich angewendet wird.Wie funktionieren Spring-Aspekte intern?

Nach meinem Verständnis zur Zeit der DAO-Injektion unter Service-Objekt, Frühling findet heraus, dass es einige Aspekt (in diesem Fall Protokollierung) für DAO konfiguriert ist, so injiziert es das Proxy-Objekt anstelle des eigentlichen Zielobjekts. Wenn nun ein tatsächlicher Aufruf einer Methode innerhalb von DAO erfolgt, wendet der Proxy die Aspekte an und ruft dann das tatsächliche Zielobjekt auf. Ist das korrekt ? Ich glaube auch, dass dies Laufzeitweben genannt wird.

Auf der anderen Seite kann das gleiche mit Ladezeit Weben (mit Java-Agent-Konfiguration) durchgeführt werden, wobei die Byte-Code-Manipulation für Klassen durchgeführt wird, auf die Aspekte angewendet werden müssen. So Proxy kommt hier nicht ins Bild.

Bitte korrigieren Sie mich, wenn ich falsch liege, da dies die Grundlage für alle Federmodule ist?

Antwort

5

Ihr Verständnis ist richtig. Spring AOP ist Proxy-basiert. Spring verwendet entweder JDK-Proxies (bevorzugt, wenn das proxied target mindestens eine Schnittstelle implementiert) oder CGLIB-Proxies (wenn das Zielobjekt keine Schnittstellen implementiert), um den Proxy für eine bestimmte Ziel-Bean zu erstellen.

Wenn nicht anders konfiguriert, führt Spring AOP Laufzeitweben durch. Sie können jedoch Spring einrichten, um das Laden der Ladezeit über AspectJ zu starten. Überprüfen Sie die documentation link für weitere Details.

Referenz für Spring AOP proxying internals

+0

Ich glaube, Ladezeit Weben ist besser in Bezug auf die Leistung, da es keinen Leistungsaufwand bei der Entscheidung, ob Proxy muss basierend auf Aspect-Konfiguration injiziert werden, was der Laufzeit Weben ist. Ja in Ladezeit Weben Server-Start dauert etwas länger, aber das ist in Ordnung als seine einmalige Aktivität –

+0

Die Leistung könnte in Ladezeit Weben besser sein (oder genauer Kompilierzeit Weben). Beste wäre es zu überprüfen, es tatsächlich durch einen Belastungstest) Aber es gibt andere Bereiche, die Sie vielleicht berücksichtigen möchten, wie die Änderungen im Build-System.Sie würden diesen Schritt einschließen, bevor Ihre Artefakte generiert werden. –

+1

Nur ein nützliches Zitat - "* Alle Probleme in der Informatik können durch eine andere Ebene der Indirektion gelöst werden, außer natürlich für das Problem der zu vielen Rückweisungen. *" - David Wheeler – smwikipedia

1

Noch gibt es zwei Punkte hier zu klären

erste in meinem Beitrag ist eigentlich Zeit laden Weben Zeit nicht laufen

Von diesem link

laden Weberei -weben (LTW) ist einfach binary Weben übergangen bis zu dem Punkt, dass ein Klassenlader lädt eine Klassendatei und definiert die Klasse zu JVM. Um dies zu unterstützen, werden ein oder mehrere "Wearing-Class-Loader" benötigt, die entweder explizit von der Laufzeitumgebung bereitgestellt oder durch einen "Web-Agenten" aktiviert werden.

zweite ist die Kompilierung

Compile-Zeit Weberei Weberei der einfachste Ansatz ist. Wenn Sie den Quellcode für eine Anwendung haben, kompiliert ajc aus der Quelle und erzeugt gewebte Klassendateien als Ausgabe. Der Aufruf des Webers ist integraler Bestandteil des AJC-Kompilierungsprozesses. Die Aspekte selbst können in Quell- oder Binärform vorliegen. Wenn die Aspekte für das Kompilieren der betroffenen Klassen benötigt werden, müssen Sie zur Kompilierungszeit weben. Aspekte sind beispielsweise erforderlich, wenn sie Mitglieder zu einer Klasse hinzufügen und andere Klassen, die kompiliert werden, auf die hinzugefügten Elemente Bezug nehmen.