Pregunta

Quiero usar @AutoWired para inyectar un bean no administrado configurado con @Component en un bean administrado. Estoy bastante seguro de que tengo la configuración correcta, pero por alguna razón sigo recibiendo la excepción:

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

Según el error, supongo que no puede encontrar la clase Baz, pero no estoy seguro de por qué. Tengo entendido que el contexto: el elemento configurado por resorte en la configuración XML se suponía que me permitiera hacer esto. También me aseguré de incluir los archivos jar apropiados (spring-weaving.jar y aspectjweaver.jar).

Aquí hay un ejemplo simple de mi configuración.

Mi configuración XML:

<beans ...>
    ...

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

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

Tengo un bean administrado:

package foo;

public class Bar {

    @Autowired
    private Baz baz;

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

    ...
}

Y un bean no administrado:

package foo;

@Component
public class Baz {
    ...
}

¿Hay algo que me falta?

EDIT : el registro enumera los beans y sus instancias, y foo.Baz no es uno de ellos. No sé por qué no está recogiendo la clase anotada @Component.

¿Fue útil?

Solución

Como Bar está configurado con xml, solo se puede configurar con xml. es decir, no puedes mezclarlos. De modo que " @ Autowired " la anotación en Baz no se está recogiendo (ninguna de las anotaciones sería). Es solo cuando agrega la anotación de primavera a nivel de clase que la primavera escuchará cualquiera de las otras anotaciones.

Lo que tendrá que hacer es configurar el bean en el xml para que se conecte automáticamente por tipo, agregue un setter para ese tipo y obtendrá el comportamiento deseado.

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

Una cosa más, cuando anota un bean con @Component, es un bean administrado por resorte. El hecho de que no se haya creado con xml no significa que no esté administrado. Un frijol no administrado es uno que no se obtiene de la primavera.

Bar y Baz son administrados por resorte. Es el mecanismo que ha elegido para definirlos lo que difiere.

Otros consejos

La respuesta anterior no es correcta, en un aspecto. Puede conectar automáticamente beans que están configurados con xml.

De la sección 3.4.5 en http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/beans.html :

Cuando se utilizan metadatos de configuración basados ??en XML [2], se especifica el modo de cableado automático para una definición de bean con el atributo de cableado automático del elemento. La funcionalidad de conexión automática tiene cinco modos. Usted especifica el cableado automático por bean y, por lo tanto, puede elegir cuáles autowire.

Puede conectar automáticamente por nombre, tipo y constructor. Aquí hay un crudo ejemplo de esto: http://www.java2s.com/ Código / Java / Spring / AutoWiring.htm

El error se debe a la secuencia de beans definida en su archivo de configuración XML.

Al igual que en su archivo XML, el bean para bar se crea primero y luego sus beans dependientes, debido a que @Autowired no puede encontrar baz .

Primero debe declarar bean para baz y luego para bar .

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top