Spring Boot的配置

一.配置文件的作用

计算机上有数以千计的配置⽂件, 我们使⽤的绝⼤多数软件, ⽐如浏览器, 微信, Idea, 甚⾄电脑, ⼿机, 都离不开配置⽂件. 我们可能永远不会直接与其中的⼤部分⽂件打交道,但它们确实以不同的形式散落在我们的计算机上, ⽐如C:\Users, C:\Windows⽂件夹, 以及各种 *.config, *.xml ⽂件
配置⽂件主要是为了解决硬编码带来的问题, 把可能会发⽣改变的信息, 放在⼀个集中的地⽅, 当我们启 动某个程序时, 应⽤程序从配置⽂件中读取数据, 并加载运⾏。
硬编码是将数据直接嵌⼊到程序或其他可执⾏对象的源代码中, 也就是我们常说的"代码写死".
⽐如⼿机字体⼤⼩。
如果采⽤硬编码的⽅式, 就直接在程序中指定字体⼤⼩, 所有的⽤⼾使⽤的都是同⼀个字体⼤⼩ ,但是不同的⽤⼾有不同的偏好, 我们可以把⼿机字体的⼤⼩放在配置⽂件中, 当程序启动时, 读取配置, 以⽤⼾设置的字体⼤⼩来显⽰

 

使⽤配置⽂件, 可以使程序完成⽤⼾和应⽤程序的交互, 或者应⽤程序与其他应⽤程序的交互。

1.SpringBoot配置⽂件

SpringBoot⽀持并定义了配置⽂件的格式, 也在另⼀个层⾯达到了规范其他框架集成到SpringBoot的⽬的.
很多项⽬或者框架的配置信息也放在配置⽂件中, ⽐如:
  • 项⽬的启动端⼝
  • 数据库的连接信息(包含⽤⼾名和密码的设置)
  • 第三⽅系统的调⽤密钥等信息
  • ⽤于发现和定位问题的普通⽇志和异常⽇志等

项⽬的启动端⼝
SpringBoot内置了Tomcat服务器, 默认端⼝号是8080, 但是⽤⼾电脑上8080端⼝号有可能就被其他应⽤程序占⽤了, 所以SpringBoot需要⽀持让⽤⼾⾃定义端⼝号
数据库连接信息
为了更⽅便简单的访问数据库, 出现了⼀些持久层框架, 其实就是对JDBC进⾏了更深层次的封装.让⽤⼾通过简单⼏⾏代码就可完成数据库的访问. 但是不同的应⽤程序访问的数据库不同, 这些持久层框架就需要⽀持⽤⼾可以⾃定义配置数据库的连接信息.

 在application.properties修改端口号:


二.配置⽂件的格式

Spring Boot 配置⽂件有以下三种:
  • application.properties
  • application.yml
  • application.yaml

yml 为yaml的简写, 实际开发中出现频率最⾼

这里只讲yml和properties

当应⽤程序启动时, Spring Boot会⾃动从classpath路径找到并加载
application.properties 和 application.yaml 或者 application.yml ⽂件.
举个栗子~
类似商品的包装⼀样, 有新⽼两款包装. properties 类型的配置⽂件就属于⽼款包装,也是创建 Spring Boot 项⽬时默认的⽂件格式(主要是因为仓库⾥还有库存),⽽ yml 属于新版包装,如果⽤⼾了解情况直接指定要新款包装,那么就直接发给他。
特殊说明
1. 理论上讲 .properties .yml 可以并存在于⼀个项⽬中,当 .properties .yml
并存时,两个配置都会加载. 如果配置⽂件内容有冲突, 则以. properties 为主, 也就是.properties 优先级更⾼.
2. 虽然理论上来讲 .properties 可以和 .yml 共存,但实际的业务当中,我们通常会采取⼀种
统⼀的配置⽂件格式,这样可以更好的维护(降低故障率).

三.properties 配置文件的说明

properties 配置⽂件是最早期的配置⽂件格式,也是创建 SpringBoot 项⽬默认的配置⽂件。

3.1properties 基本语法

properties 是以键值的形式配置的,key 和 value 之间是以"="连接的.
server.port=8080
#配置数据库连接信息
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/testdb?characterEncoding=utf8&
spring.datasource.username=root
spring.datasource.password=root
⼩技巧:配置⽂件中使⽤“#”来添加注释信息。

3.2读取配置⽂件

如果在项⽬中,想要主动的读取配置⽂件中的内容,可以使⽤ @Value 注解来实现。
@Value 注解使⽤" ${} "的格式读取,如下代码所⽰:

  1.先写配置文件

 2.引入配置文件

3.3properties缺点分析 

properties 配置是以 key-value 的形式配置的,如下图所⽰:
从上述配置key看出,properties 配置⽂件中会有很多的冗余的信息,⽐如这些:

四.yml 配置文件说明

yml 是 YAML 是缩写,它的全称 Yet Another Markup Language 翻译成中⽂就是“另⼀种标记语⾔.

4.1yml 基本语法

yml 是树形结构的配置⽂件,它的基础语法是"key: value"
key 和 value 之间使⽤英⽂冒号加空格的⽅式组成, 空格不可省略
基础语法如下:
第⼀项的配置为正确的,key 也是高亮显⽰的. 第⼆项没有空格是错误的使⽤⽅式,第⼆项的 key 也没有高亮显⽰。

4.1.1使⽤ yml 连接数据库

yml 使⽤⽰例;
spring:
2 datasource:
3 url: jdbc:mysql://127.0.0.0:3306/dbname?characterEncoding=utf8&useSSL=false
4 username: root
5 password: root
yml 和 properties 连接数据库的配置对.
4.2yml使用进阶
yml 配置不同数据类型及 null。
# 字符串
string.value: Hello

# 布尔值,true或false
boolean.value: true
boolean.value1: false

# 整数
int.value: 10

# 浮点数
float.value: 3.14159

# Null,~代表null
null.value: ~
# "" 空字符串

#, 直接后⾯什么都不加就可以了, 但这种⽅式不直观, 更多的表⽰是使⽤引号括起来
empty.value: ''

4.2yml 配置读取

yml 读取配置的⽅式和 properties 相同,使⽤ @Value 注解即可。
注意事项:
字符串默认不⽤加上单引号或者双引号,如果加英⽂的单双引号可以表⽰特殊的含义。
尝试在 application.yml 中配置如下信息:
string:
 str1: Hello \n Spring Boot.
 str2: 'Hello \n Spring Boot.'
 str3: "Hello \n Spring Boot."
读取程序实现代码如下:
@RestController
public class ReadYml {
    @Value("${string.str1}")
        private String str1;
    @Value("${string.str2}")
        private String str2;
    @Value("${string.str3}")
        private String str3;
    @RequestMapping("/yml")
        public String readYml() {
        System.out.println(str1);
        System.out.println(str2);
        System.out.println(str3);
        return "yml";
    }
}
以上程序的执⾏结果如下图所⽰:

从上述结果可以看出:
  • 字符串默认不⽤加上单引号或者双引号。
  • 单引号会转义特殊字符,使其失去特殊功能, 始终是⼀个普通的字符串.
  •  双引号不会转义字符串⾥⾯的特殊字符, 特殊字符会表⽰本⾝的含义.
此处的转义理解起来会有些拗⼝, \n 本意表⽰的是换⾏
使⽤ 单引号会转义 , 就是说, \n 不再表⽰换⾏了, ⽽是表⽰⼀个普通的字符串
使⽤ 双引号不会转义 , 表⽰ \n 表⽰的是它本⾝的含义, 就是换⾏

 

4.3配置对象

我们还可以在 yml 中配置对象,如下配置:

student:
 id: 1
 name: Java
 age: 18

或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):

student: {id: 1,name: Java,age: 18}

 这个时候就不能⽤ @Value 来读取配置中的对象了,此时要使⽤另⼀个注解

@ConfigurationProperties 来读取,具体实现如下:
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "student")
@Component
@Data
public class Student {
 private int id;
 private String name;
 private int age;
}
调⽤类的实现如下:
@RestController
public class StudentController {
 @Autowired
 private Student student;
 @RequestMapping("/readStudent")
 public String readStudent(){
 return student.toString();
 }
}

4.4配置集合

配置⽂件也可以配置 list 集合,如下所⽰:
dbtypes:
 name:
 - mysql
 - sqlserver
 - db2

集合的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:

@Component
@ConfigurationProperties("dbtypes")
@Data
public class ListConfig {
 private List<String> name;
}

 访问集合的实现如下:

@RestController
public class ReadYml2 {
 @Autowired
 private ListConfig listConfig;
 @RequestMapping("/readList")
 public String readList(){
 return listConfig.toString();
 }
}

4.5配置Map

maptypes:
 map:
 k1: kk1
 k2: kk2
 k3: kk3

或者是使⽤⾏内写法(与上⾯的写法作⽤⼀致):

maptypes: {map: {k1: kk1,k2: kk2, k3: kk3}}

Map的读取和对象⼀样,也是使⽤ @ConfigurationProperties 来读取的,具体实现如下:

@Component
@ConfigurationProperties("maptypes")
@Data
public class MapConfig {
 private HashMap<String,String> map;
}

 打印类的实现如下:

@RestController
public class ReadYml2 {
 @Autowired
 private MapConfig mapConfig;
 @RequestMapping("/readMap")
 public String readStudent(){
 return mapConfig.toString();
 }
}

4.6yml优缺点

优点 :
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/*
转换为yml
keycloak:
  realm: demo
  resource: fm-cache-cloud
  credentials:
    secret: d4589683-Oce7-4982-bcd3
 security:
   - authRoles:
       - user
     collections:
       - name: ssologinurl
         patterns:
           - /login/*
转换的过程也⽐较花费精⼒, 如果配置更复杂⼀点, 可读性会更差, 代码也会更难写。

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值