Fagioli non gestiti autowiring annotati con @Component
-
05-07-2019 - |
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.
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
.