Каков порядок приоритета при наличии нескольких профилей среды Spring, заданных spring.profiles.active

Мне просто интересно, что порядок приоритета, когда указано несколько активных профилей Spring.

Скажите, что я хочу, чтобы профиль default был активным, но профиль dev переопределял его, когда на выбор было несколько одинаковых элементов (например, beans), но с разными профилями...

Скажем, например, у меня есть два PropertySourcesPlaceholderConfigurer beans, настроенные с "default" и "dev" значениями профилей среды.

Если я использую следующую активацию профиля: -Dspring.profiles.active="default,dev"

Будет ли профиль dev переопределить default один?

Если не удается достичь вышеуказанного поведения?

Ответ 1

Порядок профилей в системном свойстве spring.profiles.active не имеет значения. "Приоритет" определяется порядком декларации beans, включая beans, специфичным для профиля, и определение bean выигрывает.

Используя ваш пример, если используется -Dspring.profiles.active="default,dev", здесь будет использоваться props bean в профиле default, просто потому, что это последнее активное определение этого bean:

<beans profile="dev">
    <bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:META-INF/dev.properties"/>
    </bean>
</beans>
<beans profile="default">
    <bean id="props" class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
        <property name="location" value="classpath:META-INF/default.properties"/>
    </bean>
</beans>

Инвертируйте порядок beans, а затем используйте версию dev, независимо от того, как профили упорядочены в spring.profiles.active.

Обратите внимание, что я не использовал <context:property-placeholder/>, потому что он не позволяет явно указывать id bean, и поэтому я не уверен, какое поведение он проявит, если используется более одного. Я предполагаю, что свойства будут объединены, так что свойства, определенные обоими, будут использовать последнее определение, но свойства, специфичные для каждого файла, останутся неповрежденными.

В противном случае, по моему опыту, вы обычно определяете beans в следующем порядке:

  • "По умолчанию" bean определения, не относящиеся к профилю
  • Переопределение определений bean в профиле, специфичном для среды
  • Переопределение определений bean в тестовом профиле

Таким образом, тестовый профиль beans будет выигрывать, если он используется в сочетании с другими профилями; иначе вы будете использовать среду beans или по умолчанию beans на основе профиля.

Ответ 2

superEB прав, порядок профилей не имеет значения для beans, порядок объявления здесь более важен, но имейте в виду, что порядок важен, если вы используете файлы конфигурации на основе профиля!