Feijão autowiring não gerenciados anotado com @Component
-
05-07-2019 - |
Pergunta
Eu quero usar @Autowired para injetar um feijão não gerenciado configurado com @Component em um bean gerenciado. Tenho certeza de que tenho o direito de configuração, mas por alguma razão eu continuo recebendo a exceção:
No unique bean of type [foo.Baz] is defined: Unsatisfied dependency of type [class foo.Baz]: expected at least 1 matching bean
Com base no erro, eu estou supondo que não é capaz de encontrar a classe Baz, mas eu não sei por que. É meu entendimento que o contexto: elemento configurado por mola na configuração XML deveria me permitir fazer isso. Eu também a certeza de incluir os arquivos jar apropriados (primavera-weaving.jar e aspectjweaver.jar).
Aqui está um exemplo simples do meu set up.
A minha configuração XML:
<beans ...>
...
<context:annotation-config/>
<context:spring-configured/>
<context:component-scan base-package="foo"/>
<bean id="bar" class="foo.Bar"/>
...
</beans>
Eu tenho um managed bean:
package foo;
public class Bar {
@Autowired
private Baz baz;
public void setBaz(Baz baz) {
this.baz = baz;
}
...
}
E um bean gerenciado:
package foo;
@Component
public class Baz {
...
}
Existe algo que eu estou perdendo?
Editar : As listas de registro dos feijões sua instantiating e foo.Baz não é um deles. Eu não sei por que ele não está pegando a classe anotada @Component.
Solução
Porque Bar é configurado com xml, só pode ser configurado com xml. ou seja, você não pode misturá-los. Assim que a anotação "@Autowired" na Baz não é ser pego (nenhuma das anotações seria). É só quando você adiciona a anotação primavera no nível de classe que a primavera vai ouvir qualquer uma das outras anotações.
O que você precisa fazer é na configuração do xml do feijão a ser autowired por tipo, adicione um setter para esse tipo e você vai conseguir o comportamento desejado.
<bean id="bar" class="foo.Bar" autowire="byType"/>
Mais uma coisa, quando você anotar um bean com @Component ele é uma mola bean gerenciado. Só porque não é criado com xml não significa que ele é gerenciado. Um bean gerenciado é aquele que você não obter a partir da Primavera.
Bar e Baz são ambos primavera gerenciado. É o mecanismo que você escolheu para defini-los que difere.
Outras dicas
A resposta anterior não é correto, em um aspecto. Você pode autowire feijão que são configurados de modo com xml.
Na seção 3.4.5 na http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html :
Ao usar baseado em XML metadados de configuração [2], você especifica autowire modo para uma definição de bean com o atributo autowire do elemento. A funcionalidade autowiring tem cinco modos. Você especifica autowiring per feijão e, portanto, pode escolher qual deles para autowire.
Você pode autowire por nome, tipo e construtor. Há um exemplo deste bruto aqui: http://www.java2s.com/ código / Java / Primavera / AutoWiring.htm
O erro é devido à seqüência de feijão definidas no seu arquivo de configuração XML.
Como em seu arquivo XML, feijão para bar
é criado primeiro e depois seus grãos dependentes devido a que @Autowired
não é capaz de encontrar baz
.
Você deve primeiro declarar feijão para baz
e depois para bar
.