복붙노트

[SPRING] 스프링 프레임 워크가 XML 기반 구성으로 어노테이션 기반 구성을 재정의 할 수 있습니까?

SPRING

스프링 프레임 워크가 XML 기반 구성으로 어노테이션 기반 구성을 재정의 할 수 있습니까?

스프링 프레임 워크가 XML 기반 구성으로 어노테이션 기반 구성을 재정의 할 수 있습니까? 주석을 통해 이미 정의 된 bean의 종속성을 변경해야하며 bean의 작성자가 아닙니다.

해결법

  1. ==============================

    1.이게 괜찮을거야. 스프링 빈 컨텍스트는 "나중에"정의가 "이전 것들"을 오버라이드하여 빈을 재정의 할 수있게한다. 주석이 정의 된 bean은 XML 정의 bean과 혼합되어 있어도 XML 정의 bean에 적용되어야합니다.

    이게 괜찮을거야. 스프링 빈 컨텍스트는 "나중에"정의가 "이전 것들"을 오버라이드하여 빈을 재정의 할 수있게한다. 주석이 정의 된 bean은 XML 정의 bean과 혼합되어 있어도 XML 정의 bean에 적용되어야합니다.

    예를 들어,

    @Configuration
    public class MyAnnotatedConfig {
       @Bean 
       public Object beanA() {
          ...
       }
    }
    
    <bean class="com.xyz.MyAnnotatedConfig"/>
    
    <bean id="beanA" class="com.xyz.BeanA"/>
    

    이 경우 beanA의 XML 정의가 우선해야합니다.

  2. ==============================

    2.나는 봄이 구성을 혼합 할 수 있다는 것을 몰랐다. 여기에 상세하고 매우 유용한 예제가 있습니다.

    나는 봄이 구성을 혼합 할 수 있다는 것을 몰랐다. 여기에 상세하고 매우 유용한 예제가 있습니다.

    Bean1은 우리가 구성하고있는 실제 빈입니다.

    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;
        }
    }
    

    화재는 의존성 인터페이스입니다.

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

    및 더미 구현 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());
        }
    }
    

    및 더미 구현 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>
    

    주류

    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());
        }
    }
    

    여기 출력은

    init
    class spring.FireImpl2
    nice
    destroy
    

    주석은 FireImpl1에 대한 의존성을 해결하지만, xml 구성은 FireImpl2로 대체됩니다. 아주 좋아.

  3. from https://stackoverflow.com/questions/4943475/can-spring-framework-override-annotation-based-configuration-with-xml-based-conf by cc-by-sa and MIT license