23 Stimmen

Interna von Spring Framework und anderen IoC-Containern

Ich habe mit Frühling für einige Zeit, aber ich habe immer gefragt, wie funktioniert es, genauer gesagt, wie sie laden und weben Beans/Klassen nur mit einer Schnittstelle oder markiert @Anmerkung .

Für die Xml-Deklarationen ist es einfach zu sehen, wie Frühling meine Bohnen vorverarbeitet (Sie sind in den Xml-Kontext deklariert, die Frühling liest), aber für die Klassen, die nur mit Annotationen markiert sind, kann ich nicht sehen, wie das funktioniert, da ich keinen Agenten an den JVM oder so übergeben.

Ich glaube, es gibt einen Java/JVM-Hook, mit dem man Klassen nach bestimmten Kriterien vorverarbeiten kann, aber ich konnte in den Unterlagen nichts dazu finden.

Kann mir jemand ein paar Dokumente zeigen? Steht dies im Zusammenhang mit dem java.lang.instrument.ClassFileTransformer API?

32voto

Jevgeni Kabanov Punkte 2602

Standardmäßig macht Spring keine keine Nachbearbeitung von Bytecode weder für XML-, noch für Annotation-konfigurierten Beans. Stattdessen werden relevante Beans in dynamische Proxies verpackt (siehe z.B. java.lang.reflect.Proxy im Java SDK). Dynamische Proxies verpacken die tatsächlich verwendeten Objekte und fangen Methodenaufrufe ab und ermöglichen die Anwendung von AOP Ratschläge anzuwenden. Der Unterschied besteht darin, dass Proxies im Wesentlichen neue künstliche Klassen sind, die vom Framework erstellt werden, während Weaving/Bytecode-Nachbearbeitung die vorhandenen Klassen verändert. Letzteres ist ohne die von Ihnen erwähnte Instrumentation API nicht möglich.

Was die Anmerkungen anbelangt, so wird die Implementierung von <context:component-scan> Tag durchsucht den Klassenpfad nach allen Klassen mit den Spring-Annotationen und erstellt Spring-Metadaten-Platzhalter für sie. Danach werden sie so behandelt, als ob sie über XML konfiguriert worden wären (oder genauer gesagt, beide werden gleich behandelt).

Obwohl Spring selbst keine Bytecode-Nachbearbeitung vornimmt, können Sie den AspectJ Weaving Agent konfigurieren, der mit Spring gut funktionieren sollte, wenn Proxies Sie nicht zufrieden stellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X