2017-01-25 2 views
0

Итак, у меня есть приложение с пружиной 4. Он состоит из 3 файлов свойств:Весна, файл свойств переключателя в зависимости от профиля

application.properties 
application-dev.properties 
application-prod.properties 

В заголовке application.properties, я указать профиль я хочу:

spring.profiles.active=dev 

Таким образом, в двух других файлах:

application-dev.properties 
application-prod.properties 

У меня есть повторяющиеся записи по ним, поэтому скажем в файле dev у меня есть: host=foo и в prod у меня: host=bar Весна затем берет значение в соответствии с активным профилем. Для того, чтобы сказать Spring, где файлы, у меня есть класс конфигурации:

@Configuration 
@ComponentScan(basePackages = "my.base.package") 
@PropertySource({ "classpath:application.properties", "classpath:application-dev.properties", "classpath:application-prod.properties" }) 
public class ServiceSpringConfiguration 
{ 
    @Bean 
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() 
    { 
    return new PropertySourcesPlaceholderConfigurer(); 
    } 
} 

Но я заметил, что таким образом, пружинные загружает все свойства из всех файлов и не допускает дубликатов, а просто загружает который вы запрашиваете, независимо от профиля. Как я могу сказать Spring загрузить файлы в соответствии с выбранным профилем? я бы ожидать Spring для сканирования имени файла и попытаться соответствовать имени профиля ....

Btw я отношусь к собственности, как так:

@Value("${host}") 
    private String  host; 
+0

Spring Загрузочный делает это для вас, нормальная весна не делает. Поэтому либо используйте Spring Boot, либо используйте собственный механизм для создания (дополнительных) источников свойств. Если вы уже используете Spring Boot, удалите '@ PropertySource' и пусть Spring Boot обработает загрузку (в этом случае вам также не понадобится« PropertySourcesPlaceholderConfigurer »). –

+0

Спасибо, я внедрил принятый ответ, и он работает очень хорошо, но я посмотрю на документы Spring Boot, thx за советом, – JBoy

ответ

2

Один простого и простое решение заключается в использовании значение свойства «spring.profiles.active» для загрузки правильных приложений. Свойства.

В вашем примере это будет выглядеть так:

@Configuration 
@ComponentScan(basePackages = "my.base.package") 
@PropertySource({ "classpath:application.properties", "classpath:application-${spring.profiles.active}.properties"}) 
public class ServiceSpringConfiguration 

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

Другим решением является создание классов конфигурации severals по профилю:

@Configuration 
@Profile('dev') 
@PropertySource("classpath:application-dev.properties") 
public class Devconfiguration { 
} 

и

@Configuration 
@Profile('prod') 
@PropertySource("classpath:application-prod.properties") 
public class Prodconfiguration { 
}