복붙노트

[SPRING] 스프링에서 동적으로 빈 참조를 설정하는 방법은?

SPRING

스프링에서 동적으로 빈 참조를 설정하는 방법은?

<bean id="Mybean" class="Bean">   
  <property name="config" ref="dev"/>   
</bean>

<bean id="dev" class="Dev">
  <property name="x" ref="Dev1">
  <property name="y" ref="Dev2">
  <property name="z" ref="Dev3">
</bean>

<bean id="stag" class="Dev">
  <property name="x" ref="Stag1">
  <property name="y" ref="Stag2">
  <property name="z" ref="Stag3">
</bean>

위의 시나리오에서 bean MyBean의 config 등록 정보는 환경에서 환경으로 변경됩니다. dev의 시간에 dev에 대한 구성 변경 참조. 그리고 스테이징에서 기준은 사슴으로 바뀝니다. 문제는 봄철 파일을 검사 할 때 발생합니다. 체크인하기 전에 config의 레퍼런스를 매번 분석해야합니다. dev의 값으로 config를 참조하면 많은 질문을 설명해야 할 수도 있습니다.

자동화 할 수있는 해결 방법이 있습니까? 참고 : Spring 버전은 2.0.1입니다.

해결법

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

    1.Spring의 PropertyPlaceholderConfigurer를 사용하고 사용되지 않는 bean을 제거하십시오 :

    Spring의 PropertyPlaceholderConfigurer를 사용하고 사용되지 않는 bean을 제거하십시오 :

    <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="location">
             <value>env.properties</value>
         </property>
    </bean>
    
    <bean id="Mybean" class="Bean">   
      <property name="config" ref="config"/>   
    </bean>
    
    <bean id="config" class="Config">
      <property name="x" ref="${x}">
      <property name="y" ref="${y}">
      <property name="z" ref="${z}">
    </bean>
    

    env.properties 파일에는 다음 등록 정보가 들어 있습니다.

    x=Dev1
    y=Dev2
    z=Dev3
    

    또는

    x=Stag1
    y=Stag2
    z=Stag3
    
  2. ==============================

    2.예 :

    예 :

    <beans>
    <bean id="configBean" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
               <property name="location"><value>env.properties</value></property>
    </bean> 
    
    <bean id="Mybean" class="Bean">   
      <property name="config" ref="${env}"/>   
    </bean>
    
    </beans>
    

    env.properties 파일에 env = dev 키 - 값을 추가해야합니다.

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

    3.Spring 2.1 (존재하지 않음)보다는 Spring 3.1을 의미한다고 가정하면 3.1에서 소개 된 새로운 "환경 프로파일"기능을 사용할 수 있습니다. 이렇게하면 각 환경에 대한 빈 세트를 정의한 다음 런타임에 "활성"세트를 선택할 수 있습니다.

    Spring 2.1 (존재하지 않음)보다는 Spring 3.1을 의미한다고 가정하면 3.1에서 소개 된 새로운 "환경 프로파일"기능을 사용할 수 있습니다. 이렇게하면 각 환경에 대한 빈 세트를 정의한 다음 런타임에 "활성"세트를 선택할 수 있습니다.

    예제는이 SpringSource 블로그 항목을 참조하십시오.

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

    4.PropertyPlaceholderConfigurer를 사용하거나 @Profile을 사용하여이 작업을 수행 할 수 있습니다.

    PropertyPlaceholderConfigurer를 사용하거나 @Profile을 사용하여이 작업을 수행 할 수 있습니다.

    참조

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

    5.PropertyPlaceholderConfigurer가 답이지만, 각 환경에 대한 속성 파일을 업데이트하지 않고도이 작업을 원한다고 생각합니다.

    PropertyPlaceholderConfigurer가 답이지만, 각 환경에 대한 속성 파일을 업데이트하지 않고도이 작업을 원한다고 생각합니다.

    내 제안은 다음과 같습니다.

    그래서 당신이해야 할 일은 콩을 똑같은 방식으로 정의하는 것입니다. 예를 들어, dev와 stag .. 당신이 명확하게 다른 설정을 보여주기 때문에 훌륭한 접근법입니다 ... 당신이 또한 추가하면 도움이 될 것입니다. 일부 별칭은 사용하려는 설정을 명확하게 보여줍니다.

    다음으로, 당신이 속한 모드를 정의하는 시스템 특성을 전달하십시오. 그리고 이상적으로는 시스템 특성을 사용하도록 PropertyPlaceholderConfigurer를 명시 적으로 설정하십시오.

    그래서 .. 당신의 설정은 다음과 같이 보입니다.

    <bean 
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"     
        systemPropertiesMode="2"/>
    
    <bean id="Mybean" class="Bean">   
      <property name="config" ref="${launch.mode}"/>   
    </bean>
    
    <bean id="dev" name="dev_mode" class="Dev">
      <property name="x" ref="Dev1">
      <property name="y" ref="Dev2">
      <property name="z" ref="Dev3">
    </bean>
    
    <bean id="stag" name="staging_mode" class="Dev">
      <property name="x" ref="Stag1">
      <property name="y" ref="Stag2">
      <property name="z" ref="Stag3">
    </bean>
    

    그러면 다음과 같은 방법으로 시작시 속성에 전달할 수 있습니다.

    -D<property-name>=<value>
    

    그래서이 경우에는

    -Dlaunch.mode=dev_mode
    

    또는

    -Dlaunch.mode=staging_mode
    

    그리고 구성 파일을 만질 필요가 없습니다.

    systemPropertiesMode에 대한 추가 참고 사항으로 허용되는 값은 다음과 같습니다.

    희망이 도움이 :)

    참고 :이 권장 사항은 3.1 이후부터 @Profile을 사용하는 것이 좋기 때문에 Spring <3.1에만 적용 가능합니다.

  6. ==============================

    6.Spring은 property placeholders라는 메커니즘을 제공한다. 이렇게하면 데이터베이스 / 등록 정보 파일에서 특정 속성을 설정할 수 있으며 시작시 봄이 채 웁니다.

    Spring은 property placeholders라는 메커니즘을 제공한다. 이렇게하면 데이터베이스 / 등록 정보 파일에서 특정 속성을 설정할 수 있으며 시작시 봄이 채 웁니다.

    이 클래스는 여기에 있습니다.

  7. from https://stackoverflow.com/questions/9124982/how-to-set-dynamically-a-bean-reference-in-spring by cc-by-sa and MIT license