English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

SpringAutomatische Konfiguration

Die automatische Konfigurationsfunktion des Spring-Frameworks ermöglicht es Ihnen, Objekt-Abhängigkeiten implizit zu injizieren. Es verwendet intern Setter oder Konstruktor-Injektion.

Automatische Konfiguration kann nicht für Primärwerte und String-Werte verwendet werden. Es kann nur für Referenzen verwendet werden.

Vorteile der Automatisierung

es braucht wenigerweil wir nicht кодировать müssen, um Abhängigkeiten explizit zu injizieren.

Nachteile der Automatisierung

keine

Es kann nicht für primitive Werte und String-Werte verwendet werden. Es kann nicht vom Programmierer kontrolliert werden.

Automatisierungsmuster

Es gibt viele Automatisierungsmuster:

MusterBeschreibung
noDies ist das Standard-Automatisierungsschema. Dies bedeutet, dass keine Automatisierung standardmäßig aktiviert ist.
byNameDas byName-Muster injiziert Objekt-Abhängigkeiten basierend auf dem Namen der Bean. In diesem Fall müssen der Attributname und der Bean-Name identisch sein. Es ruft intern die Setter-Methode auf.
byTypeDas byType-Muster injiziert Objekt-Abhängigkeiten basierend auf dem Typ. Daher können der Attributname und der Bean-Name unterschiedlich sein. Es ruft intern die Setter-Methode auf.
constructorDas Konstruktormuster injiziert Abhängigkeiten durch Aufruf des Konstruktors der Klasse. Es ruft den Konstruktor mit vielen Parametern auf.
autodetectvon Spring 3wurde nicht empfohlen.

Automatische Konfigurationsbeispiel

Lassen Sie uns ein einfaches Beispiel für die automatische Konfiguration in Spring betrachten. Sie müssen das Attribut autowire der bean-Elemente verwenden, um das Automatisierungsschema anzuwenden.

<bean id="a" class="org.sssit.A" autowire="byName"></bean>

Lassen Sie uns ein vollständiges Beispiel für die automatische Verdrahtung von Spring betrachten. Um dieses Beispiel zu erstellen, haben wir4Datei.

B.java A.java applicationContext.xml Test.java

B.java

Diese Klasse enthält nur Konstruktoren und Methoden.

package org.sssit;
public class B {
B(){System.out.println("b is created");}
void print(){System.out.println("hello b");}
}

A.java

Diese Klasse enthält Referenzen auf die Klasse B sowie Konstruktoren und Methoden.

package org.sssit;
public class A {
B b;
A(){System.out.println("a is created");}
public B getB() {
  return b;
}
public void setB(B b) {
  this.b = b;
}
void print(){System.out.println("hello a");}
void display(){
  print();
  b.print();
}
}

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans
  xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:p="http://www.springframework.org/schema/p"
  xsi:schemaLocation="http://www.springframework.org/schema/beans 
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">
<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>
</beans>

Test.java

Diese Klasse liest Bean aus der Datei applicationContext.xml und ruft die Anzeigemethode auf.

package org.sssit;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class Test {
public static void main(String[] args) {
  ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
  A a=context.getBean("a",A.class);
  a.display();
}
}

Ausgabe:

b is created
a is created
hello a
hello b

1)Modus der automatischen Assembly über byName

Im Modus der automatischen Assembly über byName müssen die Bean-ID und der Bezeichner übereinstimmen.

Innerhalb wird Setter-Injektion verwendet.

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

Wenn jedoch der Name der Bean geändert wird, werden keine Abhängigkeiten injiziert.

Lassen Sie uns schauen, wie der Name der Bean von b auf b geändert wird1Code.

<bean id="b1" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

2)Modus der automatischen Assembly über byType

Im Modus der automatischen Assembly über byType können die Bean-ID und der Bezeichner unterschiedlich sein. Es kann jedoch nur eine Bean desselben Typs geben.

Interne Verwendung der Setter-Injektion.

<bean id="b1" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byType"></bean>

In diesem Fall funktioniert es normal, weil Sie eine Instanz des Typs B erstellt haben. Es ist in Ordnung, Sie können einen anderen Namen für den Bean verwenden als den Referenznamen.

Aber wenn Sie mehrere Beans desselben Typs haben, funktioniert es nicht und wirft eine Ausnahme aus.

Lassen Sie uns schauen, dass es im Code viele B-Bean gibt.

<bean id="b1" class="org.sssit.B"></bean>
<bean id="b2" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

In diesem Fall wird eine Ausnahme ausgelöst.

3)Modus der automatischen Konfiguration des Konstruktors

Im Modus der automatischen Konfiguration des Konstruktors injiziert der Spring-Container Abhängigkeiten durch den höchstparametrisierten Konstruktor.

Wenn eine Klasse3eine Konstruktor, null Parameter, ein Parameter und zwei Parameter, und führt die Injektion durch Aufruf des zwei Parameter Konstruktors aus.

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="constructor"></bean>

4)Kein Modus der automatischen Konfiguration

Ohne den Modus der automatischen Konfiguration injiziert der Spring-Container keine Abhängigkeiten durch automatische Konfiguration.

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="no"></bean>