/*本人菜鸟一只,刚开始学习spring boot,按照导师给的学习计划整理的学习内容,希望能对和我一样是菜鸟,刚学习spring boot的童鞋有帮助。由于菜鸟一只,以下内容没有能力原创,里面的内容都是各种百度整理出来的(东拼西凑),所以作者数量太多,不方便注明,如有冒犯,我立马删帖。请各位大佬多多海涵!*/
1、配置文件的种类、作用及优先级
bootstrap和application
加载顺序:
-
bootstrap由spring父上下文加载,比application配置文件优先加载,而application配置文件由子上下文加载
-
bootstrap加载的配置信息不能被application的相同配置覆盖
配置区别:
-
bootstrap常见应用场景:
(1) bootstrap配置文件中的配置一般是引导配置,类似于bios,用于连接到spring cloud配置中心,加载应用真正需要的配置数据,如:spring.application.name和spring.cloud.config.server.git.uri
(2) 配置一些固定的不能被覆盖的属性
(3) 配置加密解密外部配置信息的相关属性
-
application常见应用场景:spring boot项目的自动化配置
外部命令引导
Spring Boot程序默认从application.properties或者application.yaml读取配置,如何将配置信息外置,方便配置呢?
查询官网,可以得到下面的几种方案:
(1) 通过命令行指定
命令行环境变量配置
在执行java -jar启动应用程序时,可以通过添加SPRING_APPLICATION_JSON配置来进行自定义属性配置,该配置是一个JSON字符串的形式,使用方式如下所示:
SPRING_APPLICATION_JSON='{"name":"system_env"}' java -jar myproject.jar
命令行参数配置:
SpringApplication会默认将命令行选项参数转换为配置信息 (少量参数可以用这个)
命令行参数这种方式也比较常用,通过 -- 进行配置:
java -jar myproject.jar --server.port = 8080
java -jar myproject.jar --name = hengboy
或者使用--spring.application.json方式也可以配置:
java -jar myproject.jar --spring.application.json='{"name":"hengboy"}'
(2) 外置配置文件
Spring程序会按优先级从下面这些路径来加载application.properties配置文件:
-
当前目录下的/config目录
-
当前目录
-
classpath里的/config目录
-
classpath根目录
因此,要外置配置文件,则在jar所在目录新建config文件夹,然后放入配置文件,或者直接放在配置文件在jar目录
2、配置文件的形式
yml配置文件
YML文件格式是YAML(YAML Aint Markup Language)编写的文件格式,YAML是一种直观的能够被电脑识别的数据序列化格式,并且容易被人类阅读,容易和脚本语言交互,可以被支持YAML库的编程语言程序导入,比如:c/c++,Python,java,c#,PHP等,YML文件是以数据为核心的,比传统的xml方式更加简洁。 YML文件的扩展名可以是.yml也可以是.yaml yml配置文件语法:
采用“key: value”的键值对形式进行设置,":"和"value"之间必须用空格隔开
server:
port: 5678
person:
name: "muzi"
age: 20
注意: 冒号后面有至少一个空格
properties配置文件
Java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件。properties文件在Java编程中用到的地方很多,操作很方便。
properties配置文件语法:
采用"键=值"的格式,可以用"#"来作注释
server.port=5678
person.name=muzi
person.age=20
3、如何读取配置文件属性配置
读取属性配置的示例:
application.properties
#服务端口号
server.port=9424
# redis配置
# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=127.0.0.1
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
demo.properties
demo.name=huang
demo.sex=1
demo.type=demo
(1) @Value
@Component
public class ReadByValue {
@Value("${server.port}")
private int serverPort;
@Override
public String toString() {
return "ReadByValue{" +
"serverPort=" + serverPort +
'}';
}
}
使用这种方式,如无其他需求,可不写setter、getter方法。
(2) @ConfigurationProperties
@Component
@ConfigurationProperties(prefix = "spring.redis")
public class ReadByConfigurationProperties {
private int database;
private String host;
public void setDatabase(int database) {
this.database = database;
}
public void setHost(String host) {
this.host = host;
public int getDatabase() {
return database;
}
public int getPort() {
return port;
}
@Override
public String toString() {
return "ReadByConfigurationProperties{" +
"database=" + database +
", host='" + host + '\'' +
'}';
}
}
使用这种方式,必须要有成员变量的setter、getter方法。
(3) @PropertySource + @Value
@Component
@PropertySource(value = {"demo/props/demo.properties"})
public class ReadByPropertySourceAndValue {
@Value("${demo.name}")
private String name;
@Value("${demo.sex}")
private int sex;
@Value("${demo.type}")
private String type;
@Override
public String toString() {
return "ReadByPropertySourceAndValue{" +
"name='" + name + '\'' +
", sex=" + sex +
", type='" + type + '\'' +
'}';
}
}
注意:使用@PropertySource注解读取属性配置,该种方式不支持读取yml配置文件
(4) @ProperySource + @ConfigurationProperties
@Component
@PropertySource(value = {"demo/props/demo.properties"})
@ConfigurationProperties(prefix = "demo")
public class ReadByPropertySourceAndConfProperties {
private String name;
private int sex;
private String type;
public void setName(String name) {
this.name = name;
}
public void setSex(int sex) {
this.sex = sex;
}
public void setType(String type) {
this.type = type;
}
public String getName() {
return name;
}
public int getSex() {
return sex;
}
public String getType() {
return type;
}
@Override
public String toString() {
return "ReadByPropertySourceAndConfProperties{" +
"name='" + name + '\'' +
", sex=" + sex +
", type='" + type + '\'' +
'}';
}
}
(5) 使用环境变量Environment读取属性配置
@Component
public class ReadByEnv {
@Autowired
private Environment environment;
public String getServerPort() {
return environment.getProperty("server.port");
}
}
4、多环境化配置
不同环境的配置yml文件名不一样:
-
application-dev.yml(开发环境)
-
application-test.yml(测试环境)
-
application-uat.yml(预发布)
-
application-pro.yml(生产环境)
如果要切换不同环境,只需要修改主配置文件application.properties中的spring.profiles.active即可,例如:
application.yml
spring:
profiles:
active: dev