Spring,switch属性文件取决于个人资料

时间:2017-01-25 14:27:43

标签: spring configuration

所以我有一个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; 

1 个答案:

答案 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 {
}