Puede framework spring anular la Anotación de configuración basado en XML de configuración?

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 Kommentare

  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.

Kommentieren Sie den Artikel

Bitte geben Sie Ihren Kommentar ein!
Bitte geben Sie hier Ihren Namen ein

Pruebas en línea