Pregunta ¿Cuál es el orden de precedencia cuando hay múltiples perfiles de entorno de Spring configurados por spring.profiles.active?


Me pregunto qué orden de precedencia cuando se han especificado múltiples perfiles activos de Spring.

Digamos que quiero el default perfil para estar activo, pero el dev perfil para anularlo cuando hay varios elementos idénticos (por ejemplo, beans) para elegir, pero con diferentes perfiles ...

Digamos, por ejemplo, tengo dos PropertySourcesPlaceholderConfigurer beans configurados con "default" y "dev" valora los perfiles de un entorno.

Si utilizo la siguiente activación de perfil: -Dspring.profiles.active="default,dev"

Será el dev perfil anular el default ¿uno?

Si no, ¿cómo se puede lograr el comportamiento anterior?


14
2018-05-12 20:03


origen


Respuestas:


El orden de los perfiles en spring.profiles.active la propiedad del sistema no importa. "Precedencia" se define por el orden de declaración de los beans, incluidos los beans específicos de un perfil, y la última definición de frijol gana.

Usando tu ejemplo, si -Dspring.profiles.active="default,dev" se usa, el props frijol en el default perfil se usaría aquí, simplemente porque es la última definición activa de ese frijol:

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

Invierta el orden de los granos, y luego dev se usaría la versión, independientemente de cómo se ordenan los perfiles spring.profiles.active.

Tenga en cuenta que no usé <context:property-placeholder/> porque no le permite especificar explícitamente una identificación de frijol, por lo que no estoy seguro de qué comportamiento mostraría si se utiliza más de uno. Imagino que las propiedades se fusionarían, de modo que las propiedades definidas por ambos usarían la última definición, pero las propiedades específicas de cada archivo permanecerían intactas.

De lo contrario, en mi experiencia, normalmente definirías los frijoles en este orden:

  1. Definiciones de beans "predeterminadas", no específicas de un perfil
  2. Anulación de definiciones de beans en un perfil específico del entorno
  3. Reemplazando las definiciones de bean en un perfil específico de prueba

De esta forma, los beans de perfil de prueba ganarían si se usaran en combinación con otros perfiles; de lo contrario, usaría beans específicos del entorno o beans predeterminados basados ​​en el perfil.


14
2018-05-13 14:04



superEB está en lo cierto: el orden de los perfiles no tiene importancia para los beans, el orden de las declaraciones es más importante allí, pero tenga en cuenta que el orden es importante si usa los archivos de configuración basados ​​en perfiles.


2
2018-06-05 15:00