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.

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top