복붙노트

[SPRING] Spring에서 Bean을 재정의하는 것을 멈추는 방법

SPRING

Spring에서 Bean을 재정의하는 것을 멈추는 방법

두 개의 XML 파일에 동일한 id를 가진 bean을 정의하면 두 번째 파일에서 overiden 될 것입니다.

Say in file a.xml i have
       <bean id="abc" />

Say in file b.xml i have
       <bean id="abc" />

b.xml의 빈 "abc"가 선택됩니다. 얼마나 많은 xml이 빈 abc를 가지고 있더라도 고유성을 가져야합니다.

해결법

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

    1.setoverflowBeanDefinitionOverriding을 호출하여 beanoverriding을 허용하지 않으려면이 기능을 비활성화하고 false를 전달할 수 있습니다. 이것은 아무것도로드되기 전에 일찍 완료되어야합니다. 이를 위해 사용자 정의 ContextLoader를 생성해야하거나 (Spring 3.1 이상인 경우) ApplicationContextInitializer를 작성하여 web.xml에 등록 할 수 있습니다.

    setoverflowBeanDefinitionOverriding을 호출하여 beanoverriding을 허용하지 않으려면이 기능을 비활성화하고 false를 전달할 수 있습니다. 이것은 아무것도로드되기 전에 일찍 완료되어야합니다. 이를 위해 사용자 정의 ContextLoader를 생성해야하거나 (Spring 3.1 이상인 경우) ApplicationContextInitializer를 작성하여 web.xml에 등록 할 수 있습니다.

    public class OverrideDisablingApplicationContextInitializer implements ApplicationContextInitializer {
    
        public void void initialize(<? extends ConfigurableApplicationContext> applicationContext);
            if (applicationContext instanceof AbstractRefreshableApplicationContext) {
                 (AbstractRefreshableApplicationContext (applicationContext)).setAllowBeanDefinitionOverriding(false);
            }
    
    }
    

    web.xml에 다음을 추가하십시오 (필요한 경우 ContextLoaderListener의 경우 DispatcherServlet에 init-param을 사용하십시오)

    <context-param>
        <param-name>contextInitializerClasses</param-name>
        <param-value>your.package.here.OverrideDisablingApplicationContextInitializer<param-value>
    </context-param>
    

    내 머리 꼭대기에서이 동작을 무시해야합니다. WebApplicationInitializer 스프링을 사용한다면 직접 ApplicationContext를 구성하는 것이 훨씬 쉽습니다. 그러면 메소드를 직접 호출 할 수 있으며 ApplicationContextInitializer는 필요하지 않습니다.

    모래밭

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

    2.또한:

    또한:

      final ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext();
      ctx.setAllowBeanDefinitionOverriding(false);
      ctx.setConfigLocations(shardContextImport);
      ctx.setParent(refreshedEvent.getApplicationContext());
      ctx.refresh();
    
  3. from https://stackoverflow.com/questions/19034273/how-to-stop-overiding-a-bean-in-spring by cc-by-sa and MIT license