所以我有一个spring 4应用程序。 它包含3个属性文件:
application.properties
application-dev.properties
application-prod.properties
在application.properties的标题中,我指定了我想要的个人资料:
spring.profiles.active=dev
所以在另外两个文件中:
application-dev.properties
application-prod.properties
我有重复的条目,所以我们在开发文件中说:
host=foo
并且我有:
host=bar
然后Spring根据当前活动的配置文件获取值。
为了告诉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根据所选的配置文件加载文件? 我希望Spring扫描文件名并尝试匹配配置文件名称....
顺便说一下,我这样称之为:
@Value("${host}")
private String host;
答案 0 :(得分:3)
一个简单而简单的解决方案是使用属性“spring.profiles.active”的值来加载正确的application.properties。
在你的例子中,它会是这样的:
@Configuration
@ComponentScan(basePackages = "my.base.package")
@PropertySource({ "classpath:application.properties", "classpath:application-${spring.profiles.active}.properties"})
public class ServiceSpringConfiguration
请注意,此解决方案存在问题,因为您可以使用多个活动弹簧配置文件,它将不再起作用。
另一种解决方案是按配置文件创建多个配置类:
@Configuration
@Profile('dev')
@PropertySource("classpath:application-dev.properties")
public class Devconfiguration {
}
和
@Configuration
@Profile('prod')
@PropertySource("classpath:application-prod.properties")
public class Prodconfiguration {
}