Как установить динамически ссылку bean в 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>

В приведенном выше сценарии свойство config в bean MyBean изменяется от среды к среде. Во время dev ссылка конфигурации изменится на dev. И в постановке эта ссылка меняется на stag. Проблема возникает во время проверки в файле spring. Мы должны каждый раз анализировать ссылку config перед проверкой. Если ссылка config с значением dev зарегистрирована, нам, возможно, придется объяснить много вопросов.

Есть ли какое-либо решение для решения проблемы автоматизации? Примечание: spring версия 2.0.1

Ответ 1

Используйте PropertyPlaceholderConfigurer от Spring и удалите неиспользуемый 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

  • настройте заполнитель bean по specfiy, пусть spring знает, что вы хотите заполнить
  • настройте конфигурацию для "my bean", используя "$ {env}"

например:

<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 = dev в файл env.properties

Ответ 3

Предполагая, что вы имели в виду Spring 3.1, а не Spring 2.1 (которого не существует), то вы можете использовать новую функцию "Профили среды", которая была введена в 3.1. Это позволяет вам определить набор beans для каждой из ваших сред, а затем выбрать "активный" один во время выполнения.

Смотрите примеры Запись в SpringSource.

Ответ 5

PropertyPlaceholderConfigurer - это ответ, но я бы предположил, что вам бы хотелось, чтобы это произошло без необходимости обновлять файл свойств для каждой среды.

Мое предложение было бы следующим образом

  • Используйте PropertyPlaceholderConfigurer, но не создавайте файл свойств
  • По умолчанию PropertyPlaceholderConfigurer сначала пытается найти значение в файле свойств, но если это не удается, он будет искать один в свойствах системы

Итак, все, что вам нужно сделать, - это определить как beans так же, как вы это делаете, т.е. 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: принятые значения следующие:

  • 0 - никогда не смотрите в свойствах системы
  • 1 - использовать системные свойства как резервные (т.е. если они не найдены в файлах свойств)
  • 2 - свойства системы всегда переопределяются (режим, который я предлагаю)

Надеюсь, это поможет:)

Примечание. Эта рекомендация применима только к Spring < 3.1, начиная с 3.1, рекомендуется использовать @Профиль

Ответ 6

Spring предоставляет механизм, называемый заполнителями свойств. Таким образом, вы можете установить определенные свойства в файле базы данных/свойств, а spring заполнит их при запуске.

Класс для использования здесь здесь.