目录
本章目标:
🚩配置文件
🚩SpringBoot配置文件
🎈配置⽂件的格式
🎈 properties 配置⽂件说明
📝properties语法格式
📝读取配置文件
📝properties 缺点分析
🎈yml 配置⽂件说明
📝yml 语法格式
📝yml 使⽤进阶
👩🏻💻初始化注解
👩🏻💻yml 配置不同数据类型及 null
✅自定义配置
✅单双引号区别
✅yml配置对象
✅yml配置集合
✅yml配置map
✅yml优缺点
本章目标:
配置对象获取用注解@Value
配置集合,map获取用注解@ConfigurationProperties(prefix = "配置名")
🚩配置文件
所谓配置文件,主要就是为了解决硬编码的问题,把可能改变的信息,都放在一起,等到需要改变的时候,直接修改配置文件里面的信息就行了。当我们启动某个程序时, 应⽤程序从配置⽂件中读取数据, 并加载运⾏。
硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死"⽐如⼿机字体⼤⼩如果采⽤硬编码的⽅式, 就直接在程序中指定字体⼤⼩, 所有的⽤⼾使⽤的都是同⼀个字体⼤⼩ ,但是不同的⽤⼾有不同的偏好, 我们可以把⼿机字体的⼤⼩放在配置⽂件中, 当程序启动时, 读取配置, 以⽤⼾设置的字体⼤⼩来显⽰
使⽤配置⽂件, 可以使程序完成⽤⼾和应⽤程序的交互, 或者应⽤程序与其他应⽤程序的交互 。
🚩SpringBoot配置文件
很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:• 项⽬的启动端⼝• 数据库的连接信息(包含⽤⼾名和密码的设置)• 第三⽅系统的调⽤密钥等信息• ⽤于发现和定位问题的普通⽇志和异常⽇志等
项⽬的启动端⼝SpringBoot内置了Tomcat服务器, 默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他应⽤程序占⽤了, 所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号。此时的端口号就是9091,我们在执行spring web的时候,我们就默认的端口号8080就无法连接成功了。
数据库连接信息
为了更⽅便简单的访问数据库, 出现了⼀些持久层框架, 其实就是对JDBC进⾏了更深层次的封装.让⽤⼾通过简单⼏⾏代码就可完成数据库的访问. 但是不同的应⽤程序访问的数据库不同, 这些 持久层框架就需要⽀持⽤⼾可以⾃定义配置数据库的连接信息.
🎈配置⽂件的格式
Spring Boot 配置⽂件有以下三种:
- • application.properties
- • application.yml
- • application.yaml
yml 为yaml的简写, 实际开发中出现频率最⾼. yaml 和yml 的使⽤⽅式⼀样, 我么现在只讲yml⽂件的使⽤当应⽤程序启动时, Spring Boot会⾃动从classpath路径找到并加载 application.properties 和 application.yaml 或者 application.yml ⽂件
- 如果项目中,同时存在properties和yml配置文件,properties的优先级更高。
- 同时存在时,两个文件都生效
- 如果两个文件中,都包含同一个配置,以properties为主。
特殊说明
- 1. 理论上讲 .properties 和 .yml 可以并存在于⼀个项⽬中,当 .properties 和 .yml 并存时,两个配置都会加载. 如果配置⽂件内容有冲突, 则以 .properties 为主, 也就是 .properties 优先级更⾼.
- 2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种统⼀的配置⽂件格式,这样可以更好的维护(降低故障率)
🎈 properties 配置⽂件说明
📝properties语法格式
- properties语法格式是以键值对的形式存在的
- key和value之间用=进行连接。
- key格式是建议小写,单词之间使用.分割
spring.application.name=ioc_demo
#设置端口号
server.port=9091#连接数据库spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=falsespring.datasource.username=rootspring.datasource.password=1005
📝读取配置文件
@RestController
public class propertiesController {//读取配置文件的内容@Value("${demo.key2}")private String key2;@RequestMapping("/readKey")public String readKey(){return "读取到的配置项key2:"+key2;}
}
🔴$的作用
@Value里面的值是字符串,用$修饰的变量,如果去掉$会给""里面的内容都打印出来。此时就获取不到demo.key2对应的value值,而是返回的是字符串里面的值。
📝properties 缺点分析
properties配置是以key-value进行配置的,从上述的配置中的key可以看出,properties配置文件中会有很多冗余的信息。
想要解决上述的冗余问题,我们就可以使用配置文件的另一个格式了,yml格式。
🎈yml 配置⽂件说明
📝yml 语法格式
- yml 是树形结构的配置⽂件,它的基础语法是"key: value".(这里红的地方必须有空格,否则语法错误)
- key 和 value 之间使⽤英⽂冒号加空格的⽅式组成,空格不可省略
使⽤ yml 连接数据库#配置数据库连接信息 spring:datasource:url: jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&useSSL=falseusername: rootpassword: xxxx
yml 和 properties 连接数据库的配置对⽐yml的格式是树形结构,数据库的连接是基于spring的,然后在datasource,在datasource中获取到url,username,password三个key。
📝yml 使⽤进阶
👩🏻💻初始化注解
@PostConstruct注解可以初始化注解。
👩🏻💻yml 配置不同数据类型及 null
✅自定义配置
//配置文件代码
demo1:key1: hello,yml
#null表示成nullkey2: ~
#空字符串表示成'',"",或者可以不写,建议标注一下 key3: ''
✅单双引号区别
String:str1: Hello \n Spring Boot.str2: 'Hello \n Spring Boot.'str3: "Hello \n Spring Boot."
yml 读取配置的⽅式和 properties 相同,使⽤ @Value 注解即可,
//单引号双引号@Value("${String.str1}")public String str1;@Value("${String.str2}")public String str2;@Value("${String.str3}")public String str3;
我们从下面图片可以看出,单引号和不加单双引号就表示转义字符,而加上双引号表示的是转义字符对应的表示的意思(换行)。
从上述结果可以看出:
- • 字符串默认不⽤加上单引号或者双引号。
- • 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
- • 双引号不会转义字符串⾥⾯的特殊字符, 特殊字符会表⽰本⾝的含义.
此处的转义理解起来会有些拗⼝, \n 本意表⽰的是换⾏
- 使⽤单引号会转义, 就是说, \n 不再表⽰换⾏了, ⽽是表⽰⼀个普通的字符串
- 使⽤双引号不会转义, 表⽰ \n 表⽰的是它本⾝的含义, 就是换⾏
以后面试官问起的时候,我们可以说在配置文件中,单引号会转义,而双引号不会转义,不会转义就意味着就表达该字符本身的含义,\n表示换行\t表示tab键。
✅yml配置对象
yml配置集合的时候,我们需要通过@ConfigurationProperties进行读取配置中的类,后期在初始化中直接可以sout student即可,因为@Date集成了toString方法。
✅yml配置集合
配置类和配置集合都是需要我们
配置⽂件也可以配置 list 集合,如下所⽰:
集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:
@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class DBType {private List<String>name;
}
用字符串数组来接收
访问集合的实现如下
✅yml配置map
@Component
@ConfigurationProperties(prefix = "dbtypes")
@Data
public class DBType {private HashMap<String,String>map;
}
@Autowiredpublic DBType dbType;@PostConstructpublic void init(){System.out.println(dbType.getMap());
}
✅yml优缺点
优点:
- 1. 可读性⾼,写法简单, 易于理解
- 2. ⽀持更多的数据类型, 可以简单表达对象, 数组, List,Map等数据形态.
- 3. ⽀持更多的编程语⾔, 不⽌是Java中可以使⽤, 在Golang, Python, Ruby, JavaScript中也可以使⽤
缺点:1. 不适合写复杂的配置⽂件⽐如properties格式如下keycloak.realm = demo keycloak.resource = fm-cache-cloud keycloak.credentials.secret = d4589683-Oce7-4982-bcd3 keycloak.security[0].authRoles[0]= user keycloak.security[0].collections[0].name = ssologinurl keycloak.security[0].collections[0].patterns[0] = /login/*
转换为ymlkeycloak:realm: demoresource: fm-cache-cloudcredentials:secret: d4589683-Oce7-4982-bcd3security:- authRoles:- usercollections:- name: ssologinurlpatterns:- /login/* 1
转换的过程也⽐较花费精⼒, 如果配置更复杂⼀点, 可读性会更差, 代码也会更难写
2. 对格式有较强的要求(⼀个空格可能会引起⼀场⾎案
要低调点,让自己的生活变得简单,就是少说自己拥有的东西。