Frage

Ich möchte @AutoWired verwenden, um eine nicht-Managed Bean mit @Component in eine Managed Bean konfiguriert zu injizieren. Ich bin mir ziemlich sicher, dass ich die Konfiguration verfügen, aber aus irgendeinem Grund, den ich erhalte immer die Ausnahme:

No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean

Auf der Grundlage des Fehler, ich bin zu raten, es nicht in der Lage ist, die Baz Klasse zu finden, aber ich bin mir nicht sicher, warum. Es ist mein Verständnis, dass der Kontext: feder konfigurierte Element in der XML-Konfigurations sollte mich erlauben, dies zu tun. Ich auch gemacht, ob die entsprechenden JAR-Dateien (feder weaving.jar und aspectjweaver.jar) aufzunehmen.

Hier ist ein einfaches Beispiel für mein Set up.

Mein XML config:

<beans ...>
    ...

    <context:annotation-config/>
    <context:spring-configured/>
    <context:component-scan base-package="foo"/>

    <bean id="bar" class="foo.Bar"/>
    ...
</beans>

Ich habe eine Managed Bean:

package foo;

public class Bar {

    @Autowired
    private Baz baz;

    public void setBaz(Baz baz) {
        this.baz = baz;
    }

    ...
}

Und eine nicht verwaltete Bean:

package foo;

@Component
public class Baz {
    ...
}

Gibt es etwas, was ich bin fehlt?

EDIT : Das Protokoll listet die Bohnen ihre instanziierenden und foo.Baz ist nicht einer von ihnen. Ich weiß nicht, warum es nicht die @Component kommentierte Klasse aufnimmt.

War es hilfreich?

Lösung

Weil Bar mit XML konfiguriert ist, kann es nur mit XML konfiguriert werden. das heißt Sie können sie nicht mischen. So dass „@Autowired“ Anmerkung auf Baz nicht abgeholt zu werden (keine der Anmerkungen wäre). Es ist nur, wenn Sie die Feder Anmerkung auf Klassenebene hinzufügen, dass der Frühling auf einem der anderen Anmerkungen hören.

Was Sie tun müssen, um die XML-Konfiguration ist in die Bohne nach Typ autowired werden, einen Setter für diese Art hinzufügen, und Sie werden das gewünschte Verhalten erreichen.

<bean id="bar" class="foo.Bar" autowire="byType"/>

Eine weitere Sache, wenn Sie eine Bohne mit @Component annotieren es ist eine Feder Managed Bean. Nur weil es mit xml nicht erstellt wird, bedeutet nicht, dass es nicht verwaltet ist. Eine nicht verwaltete Bean ist eine Sie nicht von Frühling bekommt.

Bar und Baz sind beide Federn verwaltet. Es ist der Mechanismus, die Sie gewählt haben, sie zu definieren, das unterscheidet.

Andere Tipps

Die vorherige Antwort nicht korrekt ist, in einem Aspekt. Sie können autowire Bohnen, die sonst mit XML konfiguriert sind.

Aus dem Bereich 3.4.5 in http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html :

Wenn XML-basierte Konfiguration mit Metadaten [2], geben Sie autowire Modus für eine Bean Definition mit dem autowire Attribute des Elements. Die autowiring Funktionalität hat fünf Modi. Sie geben pro Bohne autowiring und somit können, welche diejenigen wählen, um autowire.

Sie können nach Namen, Typ und Konstruktor autowire. Es ist ein krasses Beispiel dafür hier: http://www.java2s.com/ Code / Java / Frühjahr / AutoWiring.htm

Der Fehler ist auf die Folge von Bohnen in der XML-Konfigurationsdatei definiert ist.

Wie auf der XML-Datei, Bohne für bar erstellt und dann von ihnen abhängigen Bohnen aufgrund derer @Autowired nicht in der Lage ist baz zu finden.

Sie müssen zuerst erklären Bohne für baz und dann für bar.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top