Spring Boot遵循“习惯优于配置”原则,即项目中内置一个习惯性配置,开发者无需动手配置或者只需要少量配置即可让应用快速运行。那么,在Spring Boot应用中如何访问配置文件呢?

配置文件位置和优先级

Spring Boot的配置文件默认名称为application.properties或application.yml,其位置主要有三个地方:

  1. 内置,开发目录下ClassPath根目录资源/src/main/resouces,或Config包内/src/main/java/config。
  2. 外置,应用运行目录根目录或者config子目录内
  3. Config Server,由配置服务统一管理

在配置文件读取时,按照Config Server>外置>内置,config/>/, .yml>.properties的优先级顺序进行读取。即/src/main/resources/application.properties 会被/src/main/resources/config/application.yml覆盖同名配置项。

配置项可以在命令行启动时修改,如java -jar MySQLService.jar --mysql.host=localhost。等价于增加了新的配置文件,且具有最高优先级。可指定配置的所有位置如下表所示(按优先级从大到小排列)。

------------------------------------------------------------------------------------------------

  • 根目录下的开发工具全局设置属性(当开发工具激活时为~/.spring-boot-devtools.properties)。
  • 测试中的@TestPropertySource注解。
  • 测试中的@SpringBootTest#properties注解特性。
  • 命令行参数
  • SPRING_APPLICATION_JSON中的属性(环境变量或系统属性中的内联JSON嵌入)
  • ServletConfig初始化参数
  • ServletContext初始化参数
  • java:comp/env里的JNDI属性
  • JVM系统属性
  • 操作系统环境变量
  • 随机生成的带random.* 前缀的属性(在设置其他属性时,可以应用他们,比如${random.long})
  • 应用程序以外的application.properties或者appliaction.yml文件
  • 打包在应用程序内的application.properties或者appliaction.yml文件
  • 通过@PropertySource标注的属性源
  • 默认属性(通过SpringApplication.setDefaultProperties指定).

-----------------------------------------------------------------------------------------------

配置文件的构建

跟一般的.properties或.yml配置文件一样,配置项之间可以互相应用,格式为${config_item_name},多个配置项引用构成的串的值为替换配置项引用为其值形成的字符串。

Spring Boot为配置文件提供了随机值生成器,可以生成不同类型的随机值,在随机名称,标识,密码等场景下可以很方便的生成随机配置。

secret=${random.value}
service_name=service_name_${random.int}
service_id=${random.uuid}
threshold=${random.int(10)}
running_interval=${random.int[1000,5000]}

除了默认配置文件,我们也可以创建自定义的配置文件,一般放在src/main/resources 目录下。对于自定义配置文件,在访问时需要额外加注解@PropertySource("classpath:custom.properties")

配置项的读取

配置文件在要使用的地方通过注解@Value(value="${config_item_name}")将配置项的值绑定到属性。

@Value(value="${config_item_name}")
private String config_item;

如果有多个属性需要绑定,可以通过绑定一个统一的Bean实现,Bean类需要加注解@ConfigurationProperties(prefix="config_item_prefix")来指明绑定哪些配置项。对于自定义配置文件,在访问时需要额外加注解@PropertySource("classpath:custom.properties")

@ConfigurationProperties(prefix="mysql")
//@PropertySource("classpath:custom.properties")
public class MySQLConfig {
	private String host;
	private String port;
	private String username;
	private String password;
//getter 和 setter此处略去,开发中需要
}

在使用Bean配置绑定的SpringBoot应用中,需要在应用入口加上@EnableConfigurationProperties注解指明加载哪个Bean.

@SpringBootApplication
@EnableConfigurationProperties({MySQLConfig.class})
public class MySQLService{
	public static void main(String[] args){
		SpringApplication.run(MySQLService.class, args);
	}
}

在使用配置的地方(Spring Boot应用中的任何地方),直接注入Bean即可引用Bean中包含的所有配置项。

配置文件的配置

当应用部署于不同环境时,其配置细节也会发生相应变化,如数据库地址,日志级别等等。Spring Boot通过Profile区分在不同环境下使用的配置文件。带profile的配置文件命名格式为:application-{profile}.properties,其中profile即为环境标识。如开发环境:application-dev.properties.

profile可以在主配置文件中(spring.profiles.active=dev),或者启动时(--spring.profiles.active=dev,test)指定, 可以一次激活多个profile,还可以通过spring.profiles.include增加新的profile环境标识. Profile不仅可以指定运行时的配置文件,还可以指定运行时实际实例化的@Profile("dev")注明的子类。

public class base {

}
@Profile("dev")
public class A extends base {

}
@Profile("prod")
public class B extends base {

}