복붙노트

[SPRING] 동적으로 봄 콩을 바꾼다.

SPRING

동적으로 봄 콩을 바꾼다.

Java 스프링을 사용하여 런타임에 bean의 속성을 동적으로 변경하는 방법은 무엇입니까? 나는 "class1"또는 "class2"속성 "class"로 사용해야하는 bean mainView를 가지고있다. 이 결정은 "withSmartcard"특성이 "Y"또는 "N"인 특성 파일의 기초에서 이루어져야합니다.

ApplicationContext :

<bean id="mainView"
    class="mainView">
    <property name="angebotsClient" ref="angebotsClient" />
    <property name="class" ref="class1" />
</bean>



<bean id="class1"
    class="class1">
    <constructor-arg ref="mainView" />
</bean>

<bean id="class2"
    class="class2">
    <constructor-arg ref="mainView" />
</bean>

PropertyFile :

withSmartcard = Y

해결법

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

    1.PropertyPlaceHolder를 사용하여 속성 파일을 관리하십시오.

    PropertyPlaceHolder를 사용하여 속성 파일을 관리하십시오.

    <bean id="myPropertyPlaceHolder" 
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
      <description>The service properties file</description> 
      <property name="location" value="classpath:/some.where.MyApp.properties" /> 
      </bean>
    

    다음과 같이 ref 속성을 변경하십시오.

    <bean id="mainView"
        class="mainView">
        <property name="angebotsClient" ref="angebotsClient" />
        <property name="class" ref="${withSmartCardClassImplementation}" />
    </bean>
    

    특성 파일 some.where.MyApp.properties에 value로 class1 또는 class2 (사용자가 선택)를 가질 withSmartCardClassImplementation이라는 키를 추가하십시오.

    withSmartCardClassImplementation=class1
    
  2. ==============================

    2.PropertyPlaceholderConfigurer가 필요합니다. 설명서의 해당 부분은 내가 그 자리에서 할 수 있었던 것보다 더 잘 보여줍니다.

    PropertyPlaceholderConfigurer가 필요합니다. 설명서의 해당 부분은 내가 그 자리에서 할 수 있었던 것보다 더 잘 보여줍니다.

    예를 들어, 속성 값을 class1 또는 class2 (봄 컨텍스트에서 원하는 bean의 이름)로 변경해야합니다.

    또는 구성은 다음과 같을 수 있습니다.

    <bean id="mainView"
        class="mainView">
        <property name="angebotsClient" ref="angebotsClient" />
        <property name="class">
            <bean class="${classToUse}">
                <constructor-arg ref="mainView"/>
            </bean>
        </property>
    </bean>
    

    구성 파일은 다음을 포함합니다.     classToUse = fully.qualified.name.of.some.Class

    Bean이나 클래스 이름을 사용하는 것은 사용자가 편집 할 수있는 구성 파일에서는 허용되지 않으며 "Y"와 "N"을 구성 매개 변수 값으로 사용해야합니다. 이 경우 Java에서이 작업을 수행하면됩니다. Spring은 튜링 완료를 의미하지 않습니다.

    mainView는 응용 프로그램 컨텍스트에 직접 액세스 할 수 있습니다.

    if (this.withSmartCards) {
        this.class_ = context.getBean("class1");
    } else {
        this.class_ = context.getBean("class2");
    }
    

    보다 깔끔한 솔루션은 ApplicationContextAware가되어야하는 클래스의 수를 줄이고 필요에 따라 다른 클래스에 주입하는 위의 작업을 수행하는 자체 클래스의 사용자 구성 처리를 캡슐화하는 것입니다.

    BeanFactoryPostProcessor를 사용하여 프로그래밍 방식으로 클래스 속성의 정의를 등록 할 수 있습니다. FactoryBean을 사용하면 Bean을 동적으로 생성 할 수 있습니다. 둘 다 Spring의 다소 고급 사용법입니다.

    제쳐두고 : mainView와 class1 / class2 사이의 주기적 종속성을 고려할 때 예제 구성이 합법적인지 여부는 확실하지 않습니다.

  3. ==============================

    3.클래스 팩토리를 사용하십시오. 귀하의 재산에 따라 인스턴스를 반환 할 수 있습니다.

    클래스 팩토리를 사용하십시오. 귀하의 재산에 따라 인스턴스를 반환 할 수 있습니다.

  4. ==============================

    4.BeanFactoryPostProcessor를 구현 한 클래스를 작성할 수 있다고 생각합니다. 이 클래스의 bean이 (다른 bean과 함께) XML 설정 파일에 존재하면, Spring은 자동으로 postProcessBeanFactory (ConfigurableListableBeanFactory) 메소드를 호출한다. 이 메소드에 전달 된 ConfigurableListableBeanFactory 객체는 Spring이 작업을 초기화하기 전에 모든 bean 정의를 변경하는 데 사용할 수 있습니다.

    BeanFactoryPostProcessor를 구현 한 클래스를 작성할 수 있다고 생각합니다. 이 클래스의 bean이 (다른 bean과 함께) XML 설정 파일에 존재하면, Spring은 자동으로 postProcessBeanFactory (ConfigurableListableBeanFactory) 메소드를 호출한다. 이 메소드에 전달 된 ConfigurableListableBeanFactory 객체는 Spring이 작업을 초기화하기 전에 모든 bean 정의를 변경하는 데 사용할 수 있습니다.

  5. ==============================

    5.위의 @Olivier와 동의하십시오.

    위의 @Olivier와 동의하십시오.

    그것을 할 수있는 많은 방법이 있습니다.

    위의 1 번 항목을 권하고 싶습니다.

  6. from https://stackoverflow.com/questions/797894/dynamically-change-spring-beans by cc-by-sa and MIT license