2016-08-17 1 views
0
initialisiert

Mit Spring habe ich eine Klasse 'BaseController' mit BaseService injiziert mit Autowinding. Wie funktioniert das Autowirking, selbst wenn die Klasse nicht initialisiert wird? Überprüfen Sie folgenden CodeWie funktioniert @Autowired, wenn @Autowired auf Eigenschaft (Klasse) festgelegt ist, die nur deklariert, aber nicht mit Setter/Konstruktor

@Controller 
class BaseController{ 
    @Autowired 
    private BaseService baseService; 
    //...... 
} 

und Bohnen Definition in XML als

<context:annotation-config /> 
<bean name="baseService" class="com.test.service.BaseService" /> 

Ich bin nicht baseService entweder mit Setter/Constructor initialisiert. Wie funktioniert es funktioniert, wenn ich ein Verfahren, wie Show nennen unter

baseService.methodOne(); 

Antwort

1

Spring-Framework setzt auf Frühling IoC (Inversion of Control) Container alle Komponenten zu erstellen und sie initialisieren, indem ihre Abhängigkeiten zu injizieren. Die Abhängigkeiten werden durch Konstruktoren, Setter und/oder Felder unter Verwendung der reflection API injiziert.

Hier kommentierten Sie das Feld baseService mit dem Vermerk Autowired die den Frühling IoC Container zeigen eine Bohne vom Typ BaseService, wenn zu dem Zeitpunkt injizieren der Behälter Ihre Controller erstellen muss, hat sich die Abhängigkeit noch nicht erstellt und initialisiert, tut es dies automatisch und wenn diese Bean Abhängigkeiten hat, wendet sie die gleiche Logik auf die Abhängigkeiten an, bis der Abhängigkeitsbaum vollständig erstellt und initialisiert wurde. So funktioniert es auf den Punkt gebracht.

Wenn wir zwei Controller-Klassen A & B, mit der Abhängigkeit von BaseService. Erstellt der Spring-Container zwei Objekte und fügt sie separat in A oder B ein oder Nur eine Instanz von BaseService wird unter für alle Klassen aufgeteilt, für die eine Abhängigkeit besteht.

Es auf dem Rahmen ab, die Sie auf Ihrer Bean Erklärung gesetzt, wenn der Umfang Singleton ist, wird der Behälter nur eine Instanz Bean erstellen und in Ihrem Controller die gleiche Instanz injiziert dann. Wenn Sie beispielsweise Prototyp wählen, erstellt er eine neue Instanz Ihrer Bean für jeden Ihrer Controller. Wenn Sie wissen, dass singleton der Standardbereich ist, wird dieselbe Instanz injiziert. Weitere Informationen zu den unterstützten Bereichen in Spring IoC Container finden Sie unter this.

+0

Dank @Nicolas Filotto auf diese Frage Hinzufügen gesetzt, wenn wir zwei Controller-Klassen A & B haben, mit der Abhängigkeit von BaseService. Erstellt Spring-Container zwei Objekte und injiziert sie separat in A und B oder Nur eine Instanz von BaseService wird von allen Klassen mit Abhängigkeiten gemeinsam genutzt. – Giridhar

+0

Antwort aktualisiert, bitte überprüfen –

1

Wenn Sie das Klassenscannen aktiviert haben, erkennt Spring alle Spring-Bean-Typen beim Start und injiziert Abhängigkeiten, wenn sie mit @Autowired, @Resource usw. Annotationen markiert sind.

Entsprechend Ihrem Beispiel muss BaseController eine Art Frühlingsbohne und auch die BaseService sein. Wenn die BaseService eine Schnittstelle ist, muss es ein Impl geben. Wenn es viele Impls gibt, dann benötigen Sie auch eine @Qualifier Annotation.

Spring verwendet Reflektion, sodass Sie keinen Setter oder Konstruktor benötigen, um die Abhängigkeit zu injizieren.

standardmäßig alle Bohnen sind Singleton, wenn Sie Rahmen über @Scope

Verwandte Themen