Domanda

Voglio usare @AutoWired per iniettare un bean non gestito configurato con @Component in un bean gestito. Sono abbastanza sicuro di avere la configurazione corretta, ma per qualche motivo continuo a ricevere l'eccezione:

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

Sulla base dell'errore, immagino che non sia in grado di trovare la classe Baz, ma non sono sicuro del perché. Comprendo che il contesto: elemento configurato in primavera nella configurazione XML avrebbe dovuto permettermi di farlo. Mi sono anche assicurato di includere i file jar appropriati (spring-weaving.jar e aspectjweaver.jar).

Ecco un semplice esempio della mia configurazione.

La mia configurazione XML:

<beans ...>
    ...

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

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

Ho un bean gestito:

package foo;

public class Bar {

    @Autowired
    private Baz baz;

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

    ...
}

E un bean non gestito:

package foo;

@Component
public class Baz {
    ...
}

C'è qualcosa che mi manca?

EDIT : il registro elenca i bean che sta creando un'istanza e foo.Baz non è uno di questi. Non so perché non raccolga la classe annotata @Component.

È stato utile?

Soluzione

Poiché la barra è configurata con XML, può essere configurata solo con XML. cioè non puoi mescolarli. In modo che " @ Autowired " le annotazioni su Baz non vengono raccolte (nessuna delle annotazioni lo sarebbe). È solo quando aggiungi l'annotazione della primavera a livello di classe che la primavera ascolterà una qualsiasi delle altre annotazioni.

Quello che dovrai fare è nel xml configurare il bean in modo che sia autowired per tipo, aggiungere un setter per quel tipo e otterrai il comportamento desiderato.

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

Un'altra cosa, quando si annota un bean con @Component è un bean gestito a molla. Solo perché non è stato creato con XML non significa che non sia gestito. Un bean non gestito è quello che non si ottiene dalla primavera.

Bar e Baz sono entrambi gestiti a molla. È il meccanismo che hai scelto di definirli che differisce.

Altri suggerimenti

La risposta precedente non è corretta, sotto un aspetto. È possibile autowire i bean che sono altrimenti configurati con XML.

Dalla sezione 3.4.5 di http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html :

Quando si utilizzano metadati di configurazione basati su XML [2], si specifica la modalità autowire per una definizione bean con l'attributo autowire dell'elemento. La funzionalità di autowiring ha cinque modalità. Specifichi l'autowiring per bean e quindi puoi scegliere quali autorowire.

Puoi autowire per nome, tipo e costruttore. C'è un esempio approssimativo di questo qui: http://www.java2s.com/ Codice / Java / primavera / AutoWiring.htm

L'errore è dovuto alla sequenza di bean definita nel file di configurazione XML.

Come nel file XML, viene creato prima il bean per bar e quindi i bean dipendenti a causa dei quali @Autowired non è in grado di trovare baz .

Devi prima dichiarare il bean per baz e poi per bar .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top