2009-06-16 11 views
7

Ich möchte @AutoWired verwenden, um eine nicht verwaltete Bean, die mit @Component konfiguriert wurde, in eine verwaltete Bean zu injizieren. Ich bin mir ziemlich sicher, dass ich die Konfiguration verfügen, aber aus irgendeinem Grund, warum ich immer die Ausnahme bekommen:Autowiring Unmanaged Beans mit @ Komponent

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

Basierend auf dem Fehler, vermute ich es nicht in der Lage ist, die Baz Klasse zu finden, aber ich bin nicht sicher warum. Es ist mein Verständnis, dass das context: spring-konfigurierte Element in der XML-Konfiguration mir erlauben sollte, dies zu tun. Ich habe auch darauf geachtet, die entsprechenden JAR-Dateien (spring-weaving.jar und aspectjweaver.jar) einzubeziehen.

Hier ist ein einfaches Beispiel meiner Einrichtung.

Meine 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?

BEARBEITEN: Das Protokoll listet die Bohnen instanziierenden, und foo.Baz ist nicht einer von ihnen. Ich weiß nicht, warum die annotierte Klasse @Component nicht abgerufen wird.

+0

Was sagt das Logging? Erwähnt es, dass es Bohnen im Foo-Paket automatisch erkennt? Die Debugprotokollierung sollte angeben, welche @Component-Beans gefunden wurden. – skaffman

+0

Übrigens ist das aspectj/weben/Frühjahr-konfigurierte Zeug nicht notwendig für das, was Sie tun möchten. Dies ist nur einfaches Autowiren. – skaffman

Antwort

11

Da Bar mit XML konfiguriert ist, kann es nur mit XML konfiguriert werden. Sie können sie nicht mischen. So dass "@Autowired" Annotation auf Baz nicht aufgenommen wird (keine der Annotationen wäre). Nur wenn Sie die Spring Annotation auf Klassenebene hinzufügen, wird der Frühling auf die anderen Annotationen hören.

Was Sie tun müssen, ist in der XML konfigurieren Sie die Bean zu autowired nach Typ, fügen Sie einen Setter für diesen Typ und Sie werden das gewünschte Verhalten erzielen.

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

Eine weitere Sache, wenn Sie eine Bohne mit @Component annotieren es ist eine Feder Bean verwaltet. Nur weil es nicht mit XML erstellt wird, heißt das nicht, dass es nicht verwaltet wird. Eine nicht gemanagte Bohne ist eine, die du nicht vom Frühling bekommst.

Bar und Baz sind beide federgeführt. Es ist der Mechanismus, den Sie gewählt haben, um sie zu unterscheiden.

+0

Ein komplettes Missverständnis der Terminologie meinerseits. Gute Antwort. Vielen Dank! –

+3

Sie können XML- und Annotationskonfiguration mischen. – banterCZ

+0

@BanterCZ ja ... Ich habe festgestellt, dass jetzt –

6

Die vorherige Antwort ist in einem Aspekt nicht korrekt. Sie können Beans, die sonst mit XML konfiguriert werden, automatisch ansteuern.

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

Wenn XML-basierten Konfiguration mit Metadaten [2], Sie autowire Modus für eine Bean Definition mit dem autowire Attribute des Elements angeben. Die Autowire-Funktion hat fünf Modi. Sie geben das Autowiren pro Bean an und können somit auswählen, welche Autowire-Funktion verwendet werden soll.

Sie können nach Namen, Typ und Konstruktor auto- wieren. Hier ein einfaches Beispiel: http://www.java2s.com/Code/Java/Spring/AutoWiring.htm

-2

Der Fehler ist auf die Reihenfolge der in der XML-Konfigurationsdatei definierten Beans zurückzuführen.

Wie in Ihrer XML-Datei wird Bean für bar zuerst erstellt und dann ihre abhängigen Beans, aufgrund derer @Autowiredbaz nicht finden kann.

Sie müssen Bean zuerst für baz und dann für bar deklarieren.

+0

In der XML-Konfiguration können alle Beans überall deklariert werden, die Reihenfolge ist nicht relevant. –