properties和yaml 配置文件

常用的配置文件,有两种格式:application.propertiesapplication.yaml
两种类型的文件,除了写法不同之外,用法基本相同,其中.yaml文件需要注意的是在:后面要有一个空格,如user: wdy

本节使用 .properties文件介绍。

位置

SpringApplication 加载配置文件的路径和顺序如下:

  1. /config/application.properties :在jar包所在目录的子目录config下
  2. application.properties :在jar包所在目录下
  3. classpath:/config/application.properties :在类路径的子目录config下
  4. classpath:/application.properties :在类路径下

以上位置是配置文件自动加载的位置,并且按照1-2-3-4的顺序查找,所以这四个位置的优先级:1>2>3>4,先到先得。

通常在开发环境中,会把配置文件放在3、4位置,在生产环境放在1、2位置,因为1、2位置是jar包外面,修改比较方便,3、4需要重新打包。

上述位置可能不好理解,下图展示这四个文件的位置:

1、2位置图

上图是 jar包外 配置文件所在位置图

properties和yaml 配置文件_第1张图片

上图是 jar包内 配置文件所在位置图

properties和yaml 配置文件_第2张图片

上图是IDE中 配置文件 所在位置图(对应jar包内)

自定义位置

其中文件名是固定的,当然也是可以修改的,但是在运行Application时,必须指定修改后的名称,否则找不到,如下:

java -jar yourjavaproj.jar --spring.config.name=yourconfigname

以上四个位置,是默认的加载位置,当然也允许放在其他位置,也必须指定修改后的位置,否则找不到,如下:

$ java -jar yourjavaproj.jar --spring.config.location=classpath:/config/yourjavaproj.properties,file:./platform/config/your.properties

classpath:指的是Jar包内的classes路径下相对目录,即上图4位置;
file:./config 指的Jar所在路径,即上图1位置;

后面的会覆盖前面的,以下是官方给出的例子:

$ java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/
override.properties

保留默认配置文件

有时候在项目中,可能会有一个默认的配置,如果没有个性化的配置,就加载这个文件,但是使用上述方式,文件不存在会报错,官方提供了另一个命令:--spring.config.additional-location=file:./config/my.properties,如果该位置没有配置文件,会默认按照本文开始的4个位置加载配置文件。

还有一种情况,框架允许使用如下配置文件:

application-default.properties **名字不能修改,是框架默认的

无论该文件位置本文开始描述的4个位置的何处,都会被优先加载,也就是说优先级最高。

配置文件的写法

.properties写法很简单,如下:

#修改启动时的端口为 888
server.port=8888
#自定义的信息:welcome.word
welcome.word=hello world
#自定义的信息,并且引用default-number配置的值20050630
welcome.number=${default-number}
#自定义的信息:且值被welcome.number引用了
default-number=20050630
#定义一个数组
my.houses[0]=china.beijing
my.houses[1]=china.shanghai

yaml写法如下(再次强调在冒号后要有一个空格):

#修改启动时的端口为 888
server: 
	port: 8888
#自定义的信息:welcome.word
welcome: 
	word: hello world
#自定义的信息,并且引用default-number配置的值20050630
welcome: 
	number: ${default-number}
#自定义的信息:且值被welcome.number引用了
default-number: 20050630
#定义一个数组
my: 
	houses: 
		- china.beijing
		- china.shanghai

代码中如何使用配置信息?如下:

@Component
@ConfigurationProperties(prefix = "my")
public class Config{
	@Value("${welcome.word}")
	private String welcome_word;
	public String getWelcome_word(){return this.welcome_word;}
	//这里需要注意,使用@Value无法很好的解析数组等复杂对象,需要借助@ConfigurationProperties
	private List<String> houses;
	//Houses必须和配置文件中的houses一一对应
	public List<String> getHouses(){return this.houses;}
}

在spring boot中还提供了一个更便捷的方式获取配置,下文介绍。

@ConfigurationProperties 优雅的加载配置文件

除了使用@Value之外,Spring Boot提供了一个@ConfigurationProperties注解加载配置,示例如下:

  1. 先看Yaml配置,如下:
my:
  user-name: wdy
  password: 123456
  url: www.ylife.com
  1. 编写对应的类
@Data
@ConfigurationProperties("my")
public class Yaml {
	// 注意:如果配置文件中有user-name格式的key,在类中使用userName驼峰写法
    private String userName;
    private String password;
    private String url;
}

添加@ConfigurationProperties时,可能会提示:
Spring Boot Configuration Annotation Processor not found in classpath
这个只是提醒,不影响正常使用,提醒的原因是该注解会默认到classpath:下查找yaml文件,没有显示指定路径导致

  1. 把Yaml类注解为Bean
@Configuration
@EnableConfigurationProperties(Yaml.class) //就是这句话
public class Config {
	...
}

如果不使用这种方式,也可以直接在class Yaml类上添加@Component注解,直接注册为Bean

  1. 使用
	public class CommonController {
		@Autowired
	  	private Yaml config;
    }

其实和@Value相比,层次少的使用@ConfigurationProperties更方便,层次深的使用@Value更方便.
另外说明,当存在多个profiles文件时:
在第2步中,如果用于接收配置的属性类型是List,那么List中只包含 active的配置数据;如果是Set类型,那么会合并多个profiles文件中的内容,相同的内容优先级最高的生效。

你可能感兴趣的:(spring,boot,java,yaml)