2016-07-05 9 views
0

Ich habe eine Frage im Zusammenhang mit Spring Annotationen. In meinem (Lern-) Projekt habe ich zwei Klassen und eine andere Klasse definiert, die zwei Eigenschaften haben, eine von jeder dieser Arten. Um einen Fehler zu generieren, habe ich zwei Beans des gleichen Klassentyps in der XML definiert, und ich habe die Annotation @Autowired in Setter-Methoden verwendet. Etwas wie folgt aus:Spring Anmerkungen nach Name

<bean id="classA" class="beans.ClassA"></bean> 
<bean id="otherclassA" class="beans.ClassA"></bean> 
<bean id="classB" class="beans.ClassB"></bean> 
public class UpperClass{ 
    private ClassA classA; 
    private ClassB classB; 

    @Autowired 
    public void setClassA(ClassA classA){this.classA = classA} 
    @Autowired 
    public void setClassB(ClassB classB){this.classB = classB} 

    /* . 
     . 
     . 
    */ 
} 

In der Hauptklasse, erhalte ich eine Instanz der Application für diese Bohne, und drucken den Inhalt der Eigenschaften der toString Methode überschrieben, einen einfachen Test. Ich habe gelesen, dass Spring Autowired Annotation sucht nach den Beans nach Typ, so dass der Test fehlschlagen sollte, weil es zwei Beans der ClassA-Klasse definiert sind, aber es funktioniert. Es funktioniert auch mit @Resource Annotation ohne einen Namen darin zu verwenden.

Ich verwende Spring Version 4. Ich habe die ID der Beans so geändert, dass sie nicht mit den Namen der Klassen/Setter übereinstimmt, und es schlägt wie erwartet fehl.

Kann mir jemand sagen warum, oder was mache ich falsch? Sucht Spring nachName, wenn die Beans nicht nach Typ gefunden werden können?

+0

Versuchen Sie, die ID der ersten Bean in Ihrem XML zu ändern und zu sehen, was passiert. – Jason

+0

Ich habe gesehen, dass wenn Sie die Klasse statt der Bean-ID ändern, müssen Sie nicht nur den Namen des Setter-Parameters ändern, um den Fehler zu erhalten, sondern auch den Namen der Setter-Methode ändern, damit er nicht mit der Bean-ID übereinstimmt. – jgonzal

Antwort

0

Spring sucht nach Methodenparameternamen, um Mehrdeutigkeiten aufzulösen, wenn mehrere Beans mit dem gewünschten Typ übereinstimmen. IMO ist es übermäßig magisch und ein anderer Grund, @Autowired zu vermeiden. Wenn Sie dieses Verhalten nutzen (oder mit anderen umgehen müssen), macht das Spring-Plugin von IntelliJ sehr gute Arbeit, herauszufinden, welche Bohne tatsächlich an einer Autowinding-Site injiziert wird.

+0

Was ist die vorgeschlagene Alternative zu '@ ​​Autowired'? – Andreas

+0

XML-Konfiguration natürlich. Klarheit übertrumpft die Präzision. –

+0

@Andreas Sie könnten @ Qualifier verwenden, um Ambiguität zu lösen – hellojava