Puede framework spring anular la Anotación de configuración basado en XML de configuración? Necesito cambiar una dependencia de un bean, el cual ya está definido a través de anotaciones y yo no soy el autor del grano.

InformationsquelleAutor mert inan | 2011-02-09

2 Comentarios

  1. 15

    Este debe estar bien. Una Primavera de frijol contexto permite redefinir los frijoles, con «más tarde» definiciones primordial «anteriores». Esto debería aplicarse a XML definido por el frijol, así como la anotación definido frijoles, incluso si son mixtos.

    Por ejemplo, si usted tiene

    @Configuration
    public class MyAnnotatedConfig {
       @Bean 
       public Object beanA() {
          ...
       }
    }

    <bean class="com.xyz.MyAnnotatedConfig"/>
    
    <bean id="beanA" class="com.xyz.BeanA"/>

    En este caso, la definición XML de beanA debe tomar precedencia.

    • Sin embargo, esto podría no funcionar para @Autowired campos, basado en el tipo? Esto parece tirar org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [com.xyz.BeanA] is defined: expected single matching bean but found 2: [beanA, beanA] (Primavera 3.2)
  2. 17

    yo no sabía que la primavera se puede mezclar configuraciones. aquí es la detallada y muy útil ejemplo.

    Bean1 es el real bean estamos configurando.

    package spring;
    
    import javax.annotation.PostConstruct;
    import javax.annotation.PreDestroy;
    
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component
    public class Bean1 {
    
        private String naber;
    
        @Autowired
        @Qualifier("FireImpl1")
        private Fire fire;
    
        @PostConstruct
        public void init() {
            System.out.println("init");
            getFire().fire();
        }
    
        @PreDestroy
        public void destroy() {
            System.out.println("destroy");
        }
    
        public void setNaber(String naber) {
            this.naber = naber;
        }
    
        public String getNaber() {
            return naber;
        }
    
        public void setFire(Fire fire) {
            this.fire = fire;
        }
    
        public Fire getFire() {
            return fire;
        }
    }

    Fuego es la dependencia de la interfaz de

    package spring;
    
    public interface Fire {
    
        public void fire();
    }

    y ficticio aplicación 1

    package spring;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component
    @Qualifier("FireImpl1")
    public class FireImpl1 implements Fire {
    
        public void fire() {
            System.out.println(getClass());
        }
    }

    y ficticio aplicación 2

    package spring;
    
    import org.springframework.beans.factory.annotation.Qualifier;
    import org.springframework.stereotype.Component;
    
    @Component
    @Qualifier("FireImpl2")
    public class FireImpl2 implements Fire {
    
        public void fire() {
            System.out.println(getClass());
        }
    }

    config.xml

    <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop"
        xmlns:context="http://www.springframework.org/schema/context" xmlns:jee="http://www.springframework.org/schema/jee"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="
                http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd
                http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
        <context:component-scan base-package="spring" />
        <bean id="bean1" class="spring.Bean1">
            <property name="naber" value="nice" />
            <property name="fire" ref="fireImpl2" />
        </bean>
    </beans>

    y la clase principal de la

    package spring;
    
    import org.springframework.context.support.ClassPathXmlApplicationContext;
    
    public class Spring {
    
        public static void main(String[] args) {
    
            ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("/spring/config.xml");
            applicationContext.registerShutdownHook();
            Bean1 bean = (Bean1) applicationContext.getBean("bean1");
            System.out.println(bean.getNaber());
        }
    }

    aquí está la salida

    init
    class spring.FireImpl2
    nice
    destroy

    Aunque anotación resuelve la dependencia a FireImpl1, xml config overrided con FireImpl2.
    muy bonito.

Dejar respuesta

Please enter your comment!
Please enter your name here