2012-02-03 2 views
10
<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 в фасоли MyBean изменяется от окружающей среды к окружающей среде. Во время dev ссылка конфигурации изменится на dev. И в постановке, ссылка меняется на stag. Проблема возникает во время проверки в файле весны. Мы должны каждый раз анализировать ссылку config перед проверкой. Если указана конфигурация со значением dev, нам, возможно, придется объяснить много вопросов.Как установить динамическую ссылку на компонент весной?

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

+0

Нет такой вещи, как Spring 2.1. Там 2.0 и 2.5. Вы имеете в виду 3.1? – skaffman

+0

Вы используете Maven? –

ответ

9

Используйте PropertyPlaceholderConfigurer с весны, и удалить неиспользуемый боб:

<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 
1

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

Класс, который следует использовать для этого, находится here.

+0

Решение не работает. Он дает ошибку, что bean с именем {dev} не определен .. Любая помощь ?? – Shashi

2

Вы можете сделать это с помощью PropertyPlaceholderConfigurer или с помощью @Profile

Также см

+1

@ShashiBhushan: [PropertyPlaceholderConfigurer] (http://static.springsource.org/spring/docs/1.0.0/api/org/springframework/beans/factory/config/PropertyPlaceholderConfigurer.html) был весной с 1.0. – beny23

+0

Указывает на то, что bean с именем {dev} не определен .. Любая справка .. Может быть PropertyPlaceholderConfigure используется для предоставления динамического «значения», а не динамического «ref». Shashi

+1

Вы забыли "$": 'ref =" $ {dev} "' –

3

Предполагая, что вы имели в виду Spring 3.1, а не Spring 2.1 (который не существует), то вы можете использовать новый «En vironment Profiles ", которая была представлена ​​в 3.1. Это позволяет вам определить набор компонентов для каждой из ваших сред, а затем выбрать «активный» один во время выполнения.

См. Здесь SpringSource Blog Entry.

4
  1. настройка вверх по заполнителю фасоли по Определяешь, пусть весна знает, что вы хотите, чтобы заполнитель
  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 = dev ключ-значение для env.properties файла

2

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

Мое предложение будет выглядеть следующим образом

  1. Использование PropertyPlaceholderConfigurer, но не создавать файл свойств
  2. По умолчанию 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, принятым значениям являются следующим:

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

Надеются, что это помогает :)

Примечание: Настоящая рекомендация применима только к весне < 3.1, поскольку начиная с 3.1 рекомендуется использовать @Profile