Как установить динамически ссылку 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.
Ответ 4
Вы можете сделать это, используя PropertyPlaceholderConfigurer
или используя @Profile
Также см.
Ответ 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 заполнит их при запуске.
Класс для использования здесь здесь.