In einer Spring-Anwendung habe ich @Autowired(required=false)
für Konstruktor verwendet. Dies bedeutet, dass, wenn die Bean, die autowiriert werden soll, in der XML-Datei nicht verfügbar ist, keine NoSuchBeanDefinitionException
geworfen werden sollte, da ( required=false
) erwähnt wird. Aber ich bekomme die UnsatisfiedDependencyException
, NoSuchBeanDefinitionException
Ausnahme.
---- TextEditor
%Vor%---- Rechtschreibprüfung
%Vor%---- Beans.xml
%Vor%--- Konsole (tatsächliches Ergebnis)
%Vor% --- Erwartetes Ergebnis
Das Programm sollte ohne Exception
laufen, da @Autowire(required=false)
für den Konstruktor erwähnt wird. Selbst wenn die Bean nicht gefunden wird, sollte die Ausnahme nicht kommen, da ( required=false
) erwähnt wird.
Diese Ausnahme tritt auf, weil required = false nicht bedeutet, dass sie null injiziert. Wenn es auf Konstruktoren angewendet wird, versucht Spring zu entscheiden, welcher Konstruktor am besten zum Erstellen der Instanz geeignet ist. In diesem Fall haben Sie nur einen Konstruktor, der einen SpellChecker, aber kein Objekt dieses Typs benötigt.
Wie im Spring-Dokument ( Ссылка ):
Nur ein Konstruktor (maximal) einer gegebenen Bean-Klasse darf diese Annotation tragen, die angibt, dass der Konstruktor bei Verwendung als Spring-Bean autowire ist. Ein solcher Konstruktor muss nicht öffentlich sein.
Wie auch immer, Sie können einen Standardkonstruktor hinzufügen (er kann privat sein), damit Spring, wenn er seine @Autowired-Magie nicht ausführen kann, diesen verwenden wird. In Ihrer TextEditor-Klasse könnten Sie hinzufügen:
%Vor%Beachten Sie, dass @Deprecated verwendet wird, um zu vermeiden, dass Ihr Compiler Sie warnt, dass Sie einen privaten Konstruktor haben, den niemand verwendet.
Ich hatte ein ähnliches Problem. Tatsächlich können Sie mehrere Konstruktoren mit
haben %Vor%Achten Sie jedoch darauf, dass Sie diese Annotation nicht zum Standardkonstruktor (ohne Argumente) hinzufügen können, da für die Anmerkung @Autowired mindestens ein Argument erforderlich ist