2008-10-23 6 views
20

Ich habe seit einiger Zeit mit Feder, aber ich mich immer gefragt, wie es funktioniert, genauer gesagt, wie laden sie und weben Bohnen/Klassen markiert nur mit einer Schnittstelle oder @ Annotation.Internals Spring Framework und andere IoC Container

Für die XML-Deklarationen ist es einfach zu sehen, wie Spring meine Beans vorverarbeitet (sie sind in dem xml-Kontext im Frühjahr gelesen), aber für die nur mit Anmerkungen markierten Klassen kann ich nicht sehen, wie das funktioniert Ich gebe keinen Agenten an den JVM oder so weiter.

Ich glaube, es gibt einige Java/JVM Haken, die Sie Vorprozess Klassen durch eine Art von Kriterien erlaubt, aber ich war nicht in der Lage, alles auf die Dokumentation zu herausgefunden.

Kann mir jemand einige Dokumente zeigen? Handelt es sich um die java.lang.instrument.ClassFileTransformer API?

Antwort

28

Eigentlich standardmäßig Frühling nicht tun, um jede Bytecode Nachbearbeitung weder für XML-, noch Annotation-konfigurierten Bohnen. Stattdessen werden relevante Beans in dynamische Proxies eingeschlossen (siehe z.B. java.lang.reflect.Proxy im Java SDK ). Dynamische Proxies wickeln die tatsächlichen Objekte, die Sie verwenden und abfangen Methodenaufrufe, so dass AOP Ratschläge anzuwenden. Der Unterschied besteht darin, dass Proxies im Wesentlichen neue künstliche Klassen sind, die durch das Framework erzeugt werden, während das Weben/Bytecode-Postprocessing die existierenden verändert. Letzteres ist ohne die von Ihnen erwähnte Instrumentation API nicht möglich.

Wie bei den Anmerkungen wird die Implementierung des Tags <context:component-scan> den Klassenpfad für alle Klassen mit den Spring-Anmerkungen durchsuchen und Spring-Metadaten-Platzhalter für sie erstellen. Danach werden sie so behandelt, als ob sie per XML konfiguriert wären (oder genauer gesagt, beide werden gleich behandelt).

Obwohl Frühling nicht Bytecode Nachbearbeitung tun selbst können Sie die AspectJ Weben Agent konfigurieren, die mit Feder gut funktionieren sollte, wenn Proxies Sie nicht zufriedenstellen.

+0

Danke, tolle Antwort! Ich war etwas verwirrt darüber, wie Spring oder irgendein anderes Framework auf meine Klassen zugreifen konnte, ohne dass ich sie an den Container lieferte, aber jetzt macht es Sinn :) –

+0

Ich sollte darauf hinweisen, dass die Verwendung von Proxy bedeutet, dass Sie Code zu Interfaces verwenden müssen, um Spring zu verwenden ohne Weben (Proxy funktioniert nur mit Schnittstellen) –

+1

Nein. JDK-Proxies funktionieren nur mit Schnittstellen, CgLib-Proxies arbeiten auch mit normalen Klassen. –

1

The Spring Framework download wird mit dem Quellcode geliefert, so dass Sie einen Höhepunkt am Code selbst (im Ordner src) finden können, um herauszufinden.

The reference manual ist auch ziemlich lang (588 Seiten, wenn Sie es herunterladen as a PDF).

+3

Danke, aber ich war für eine Art und Weise von nicht tauchen in die Federquelle suchen ... Wie auch immer die PDF erwähnt nicht die Interna des Frühlings. –

+0

Ich verstehe nicht, warum das abgelehnt wird! –