Heim >Java >javaLernprogramm >Detaillierte Erläuterung des Prinzips der automatischen Assemblierung von Spring, implementiert durch den Java-Annotationsmechanismus
In diesem Artikel wird hauptsächlich das Spring-Prinzip der automatischen Assembly-Implementierung des Java-Annotationsmechanismus im Detail vorgestellt. Interessierte Freunde können sich auf
Die Hauptsituationen der Verwendung von Annotationen in Java in SpringMVC (Spring Boot) beziehen usw.) entsprechen Annotationen tatsächlich einer Markup-Sprache, die es Ihnen ermöglicht, Mitglieder, die das Markup zur Laufzeit haben, dynamisch zu bearbeiten. Hinweis: Das Spring-Framework unterstützt standardmäßig keine automatische Assemblierung, Sie müssen das Autowire-Attribut des 60e23eb984d18edbb092da6b8f295aba-Tags ändern.
Das Autowiring-Attribut hat 6 optionale Werte, die jeweils unterschiedliche Bedeutungen haben:
byName -> Beim Abrufen des Zielobjekts aus der Spring-Umgebung werden die Attribute im Zielobjekt gefunden der id-Attributwert des 60e23eb984d18edbb092da6b8f295aba-Tags in der gesamten Spring-Umgebung basierend auf seinem Namen. Wenn dieselben vorhanden sind, rufen Sie dieses Objekt ab und implementieren Sie die Zuordnung. Die gesamte Spring-Umgebung: Bedeutet, dass alle Spring-Konfigurationsdateien durchsucht werden, dann kann die ID nicht wiederholt werden.
byType -> Beim Abrufen des Zielobjekts aus der Spring-Umgebung suchen die Attribute im Zielobjekt in der gesamten Spring-Umgebung nach dem Klassenattributwert der Typ. Wenn dieselben vorhanden sind, rufen Sie dieses Objekt ab und implementieren Sie die Zuordnung.
Nachteile: Wenn mehrere Bean-Objekte desselben Typs vorhanden sind, tritt ein Fehler auf, wenn das Attribut ein einzelner Datentyp ist. Wenn mehrere zugehörige Objekte gefunden werden, tritt ein Fehler auf Wenn das Attribut vom Typ Array oder Sammlung (generisch) ist, tritt keine Ausnahme auf, wenn mehrere zugehörige Objekte gefunden werden.
Konstruktor ->Die Verwendung der Konstruktormethode zum Abschließen der Objektinjektion ist eigentlich eine Objektsuche basierend auf dem Parametertyp der Konstruktormethode, was der Verwendung von byType entspricht.
automatische Erkennung ->Automatische Auswahl: Wenn das Objekt keine parameterlose Konstruktionsmethode hat, wird für die Konstruktionsinjektion automatisch die automatische Montagemethode des Konstruktors ausgewählt. Wenn das Objekt einen Konstruktor ohne Parameter enthält, wird die automatische Assemblierungsmethode byType automatisch für die Setter-Injektion ausgewählt.Wenn mehrere Konfigurationsdateien vorhanden sind, ist die automatische Assemblierungsmethode jeder Konfigurationsdatei unabhängig.
Verwenden Sie ein benutzerdefiniertes Annotationselement, den Code lautet wie folgt:
package annotation; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface AttachAnnotation { String paramValue() default "河北省"; // 参数名为"paramValue" 默认值为"河北省" }
Der Testvorgang führt die Hauptfunktion aus. Der spezifische Code lautet wie folgt:
package annotation; /** * @author 路人宅 */ public class AttachEmlement { // 普通 public void AttachDefault(String name){ System.out.println("归属:" + name); } // 使用注解并传入参数 @AttachAnnotation(paramValue="河北省") public void AttachAnnotation(String name){ System.out.println("归属:" + name); } // 使用注解并使用默认参数 @AttachAnnotation public void AttachAnnotationDefault(String name){ System.out.println("归属:" + name); } }
Ausführungsergebnis:
Eigentümer: Provinz Henan
package annotation; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class AnnotionOperator { public static void main(String[] args) throws IllegalAccessException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException { AttachEmlement element = new AttachEmlement(); // 初始化一个实例,用于方法调用 Method[] methods = AttachEmlement.class.getDeclaredMethods(); // 获得所有方法 for (Method method : methods) { AttachAnnotation annotationTmp = null; if ((annotationTmp = method.getAnnotation(AttachAnnotation.class)) != null) method.invoke(element, annotationTmp.paramValue()); else method.invoke(element, "河南省"); } } }Eigentümer: Provinz Hebei
Spring verfügt über zwei Betriebsmöglichkeiten, um die automatische Assemblierung zu erleichtern: Vererbung der Klasse org.springframework.web.context.support.SpringBeanAutowiringSupport oder Hinzufügen von @Component/@Controller und anderen Annotationen und Deklarieren der context:component-scan-Elementkonfiguration in der Spring-Konfiguration Datei.
1) Die Vererbungsmethode realisiert die automatische Verkabelung. Wenn Sie sich den Spring3.1.1-Quellcode ansehen, finden Sie den folgenden Code in der SpringBeanAutowiringSupport-Klasse:
Analyse: Java ruft beim Instanziieren und Konstruieren den Standardkonstruktor der übergeordneten Klasse ohne Parameter auf, und Spring verwendet diesen, um den Operationselementcode auszuführen.
2) Die Annotationsmethode ähnelt der obigen Theorie. Es ist erwähnenswert, dass die automatische Annotationsassemblierung die Injektion von Setter* nicht abschließen muss. Überprüfen Sie die Annotationsaufrufsequenz von Spring3.1.1 :
org.springframework.web .context.support.SpringBeanAutowiringSupport#SpringBeanAutowiringSupport=>
/** * This constructor performs injection on this instance, * based on the current web application context. * Intended for use as a base class. * @see #processInjectionBasedOnCurrentContext */ public SpringBeanAutowiringSupport() { processInjectionBasedOnCurrentContext(this); }org.springframework.beans.factory.annotation .AutowiredAnnotationBeanPostProcessor#processInjection= >
org.springframework.beans.factory.annotation.InjectionMetadata#Injection, sehen Sie sich den Quellcode der Inject-Methode wie folgt an:
Analyse: Durch den obigen Quellcode wird Spring Autowiring durch den Reflexionsmechanismus implementiert.
Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Prinzips der automatischen Assemblierung von Spring, implementiert durch den Java-Annotationsmechanismus. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!