常用的配置文件,有两种格式:application.properties
和 application.yaml
两种类型的文件,除了写法不同之外,用法基本相同,其中.yaml
文件需要注意的是在:
后面要有一个空格,如user: wdy
本节使用 .properties
文件介绍。
SpringApplication 加载配置文件的路径和顺序如下:
/config/application.properties
:在jar包所在目录的子目录config下application.properties
:在jar包所在目录下classpath:/config/application.properties :
在类路径的子目录config下classpath:/application.properties :
在类路径下以上位置是配置文件自动加载的位置,并且按照1-2-3-4的顺序查找,所以这四个位置的优先级:1>2>3>4,先到先得。
通常在开发环境中,会把配置文件放在3、4位置,在生产环境放在1、2位置,因为1、2位置是jar包外面,修改比较方便,3、4需要重新打包。
上述位置可能不好理解,下图展示这四个文件的位置:
上图是 jar包外 配置文件所在位置图
上图是 jar包内 配置文件所在位置图
上图是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中还提供了一个更便捷的方式获取配置,下文介绍。
除了使用@Value
之外,Spring Boot提供了一个@ConfigurationProperties
注解加载配置,示例如下:
my:
user-name: wdy
password: 123456
url: www.ylife.com
@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文件,没有显示指定路径导致
@Configuration
@EnableConfigurationProperties(Yaml.class) //就是这句话
public class Config {
...
}
如果不使用这种方式,也可以直接在
class Yaml
类上添加@Component
注解,直接注册为Bean
public class CommonController {
@Autowired
private Yaml config;
}
其实和@Value相比,层次少的使用@ConfigurationProperties更方便,层次深的使用@Value更方便.
另外说明,当存在多个profiles文件时:
在第2步中,如果用于接收配置的属性类型是List,那么List中只包含 active的配置数据;如果是Set类型,那么会合并多个profiles文件中的内容,相同的内容优先级最高的生效。