Возможно ли иметь несколько PropertyPlaceHolderConfigurer в моем applicationContext?
Мне нужно загрузить определенный applicationContext.xml-файл в соответствии с заданным системным свойством. Это само загружает файл с фактической конфигурацией. Поэтому мне нужно 2 PropertyPlaceHolderConfigurer, один из которых разрешает системный параметр, а другой-в фактической конфигурации.
есть идеи, как это сделать?
8 ответов:
Да, вы можете сделать больше, чем один. Будьте уверены, чтобы установить ignoreUnresolvablePlaceholders Так что первый будет игнорировать любые заполнители, которые она не может решить.
<bean id="ppConfig1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="true"/> <property name="locations"> <list> <value>classpath*:/my.properties</value> </list> </property> </bean> <bean id="ppConfig2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="ignoreUnresolvablePlaceholders" value="false"/> <property name="locations"> <list> <value>classpath*:/myOther.properties</value> </list> </property> </bean>
в зависимости от вашего приложения вы должны исследовать systemPropertiesMode, он позволяет загружать свойства из файла, но позволяет свойствам системы переопределять значения в файле свойств, если они установлены.
остерегайтесь -- там может быть ошибка, связанная с несколькими конфигураторами. См.http://jira.spring.io/browse/SPR-5719 для более подробной информации.
Я не могу получить несколько для работы локально... но я пока никого не виню, кроме себя.
другое решение-использовать свойство placeholderPrefix объекта PropertyPlaceholderConfigurer. Вы указываете его для второго (третьего, четвертого...) конфигуратор, а затем префикс всех ваших соответствующих заполнителей, таким образом, не будет никакого конфликта.
<bean id="mySecondConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer" p:location="classpath:/myprops.properties" p:placeholderPrefix="myprefix-"/> <bean class="com.mycompany.MyClass" p:myprop="${myprefix-value.from.myprops}"/>
вы не можете сделать это напрямую, и эта проблема JIRA от Spring объясняет, почему (проверьте комментарий от Chris Beams для подробного объяснения):
https://jira.springsource.org/browse/SPR-6428
однако он предоставляет обходной путь с помощью Spring 3.1 или более поздней версии, который должен использовать класс PropertySourcesPlaceholderConfigurer вместо класса PropertyPlaceholderConfigurer.
вы можете скачать проект на основе Maven, который демонстрирует проблема и решение из весеннего фреймворка вопросов github:
https://github.com/SpringSource/spring-framework-issues
найдите номер проблемы, SPR-6428, в загруженных проектах.
на моей стороне, играя с PropertyPlaceholderConfigurer оба свойства:
- порядок (должен быть ниже для первого доступа / разбора КПП)
ignoreUnresolvablePlaceholders ("false "для первого доступного/проанализированного PPC," true " для следующего)
а также дать 2 различных идентификаторов для обоих КПП (чтобы избежать одного быть перезаписаны другим)
работает отлично
надеюсь, это поможет
у нас работает следующий подход:
<util:properties id="defaultProperties"> <prop key="stand.name">DEV</prop> <prop key="host">localhost</prop> </util:properties> <context:property-placeholder location="file:${app.properties.path:app.properties}" properties-ref="defaultProperties"/>
системное свойство
app.properties.path
может использоваться для переопределения пути к файлу конфигурации.и приложение связывает некоторые значения по умолчанию для заполнителей, которые не могут быть определены с помощью значений по умолчанию в общих модулях.
просто давая 2 различных идентификаторов работал для меня. Я использую spring 3.0.4.
надеюсь, что это поможет.
в случае, вам нужно определить два КПП (как в моей ситуации) и использовать их независимо. Установив свойство placeholderPrefix, вы можете получить значения из нужного PPC. Это будет удобно, когда оба набора свойств PPC имеют одинаковые ключи, и если вы не используете это свойство ppc2 переопределит ppc1.
определение xml:
<bean name="ppc1" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties" ref="ref to your props1" /> <property name="placeholderPrefix" value="$prefix1-{" /> </bean> <bean name="ppc2" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="properties" ref="ref to your props2" /> <property name="placeholderPrefix" value="$prefix2-{" /> </bean>
извлечение во время выполнения:
@Value(value = "$prefix1-{name}") private String myPropValue1; @Value(value = "$prefix2-{name}") private String myPropValue2;