3 配置
3.1 属性配置
配置文件:我们从SpringBoot学习的前置知识可知,Spring的配置文件都是写在resources中。打开resources,映入眼帘的是一个名为application.properties的配置文件。
这正是SpringBoot项目的配置文件;在以前Spring的工程中,我们需要书写一堆的配置文件,但在SpringBoot的工程中,一切都被简化了。
修改端口:我们知道,properties后缀的配置文件书写方式一般采用key:value的形式,试着在上面写端口的英文port,我们发现了提示,这正是我们寻求的配置文件,直接回车,按server.port:80
的形式即可修改端口号为80。
修改logo:logo实际上在设计层面不叫logo,而是叫banner;在配置文件中配置spring.main.banner-mode
可以修改控制台中的banner,如设置off可以将控制台中的banner关闭,设置log可以将banner记录到日志中。
除此之外,使用spring.banner.image.location
可以修改logo的形状。
日志级别:使用loggin.level.root可以修改日志的等级,默认为info(提示)。
提示:在配置文件中可以配置的信息太多了,基本上无法记住和识别;实际上你也可以通过猜测来选中某一些配置来测试,但如果想要准确地使用配置,则需要去官网中查找官方文档中记载的所有配置信息。
官方配置文档:Common Application Properties (spring.io)
3.2 配置文件分类
说明:除了application.properties,SpringBoot提供了多种属性的配置方式。
- application.properties
- application.yml(主流)
- application.yaml
提示:
- 若同时存在三类配置文件,且配置文件中都配置了相同的配置,则优先级为properties>yml>yaml
- 若IDEA没有识别出配置文件,则可以通过手动来添加;有绿叶子表示成功被识别,如果没有则按下图去手动添加。
步骤演示:
- 在resources下创建一个application.yml,并且把原来的application.properties删除。
- 在resources下创建一个application.yaml,并且把原来的application.yml删除。
3.3 yaml文件
说明:YAML是一种数据序列化格式,该文件格式有两种扩展名:yml和yaml。
优点:
- 容易阅读
- 容易与脚本语言交互
- 以数据为核心,重数据轻格式
语法规则:
- 大小写敏感
- 属性层级关系使用多行描述
- 使用缩进表示层级关系,同层级左侧对齐,只允许使用空格
- 属性值前面添加空格
- \# 表示注释
一个属性有多个值可以采用数组或对象,数据可以采用层级关系写法,对象也是
like: - game - music - sleep # 相当于 like: [game,music,sleep] user1:{ name: zhangsan age: 18 } # 相当于 user1: - name:zhangsan age:18
字面值表示方式:
3.4 yaml数据读取
说明:使用@Value可以读取单个属性,属性名引用的方式必须采用SpEL表达式的方式来引用:${属性名}
步骤演示:
编写配置文件
country: china user: name: 'ArimaMisaki' age: 23 hobby: - music - sing user1: - name: zhangsan age: 18
编写类
package springboot_01_01_quickstart.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController @RequestMapping("/books") public class BookController { // 读取yaml数据中的单一数据 // 使用Value注解,采用el表达式 @Value("${country}") private String country1; // 层级关系读 @Value("${user.name}") private String username; @Value("${user.age}") private Integer age; // 数组属性读取采用索引 @Value("${hobby[0]}") private String hobby; // 对象属性读取采用. @Value("${user1[0].name}") private String user1Name; @GetMapping public String getById(){ System.out.println("springboot is running"); System.out.println("country1==>"+country1); System.out.println("username==>"+username); System.out.println("userAge==>"+age); System.out.println("hobby==>"+hobby); System.out.println("user1Name==>"+user1Name); return "springboot is running"; } }
- 启动服务器,访问对应路径并查看控制台
3.5 配置文件中的变量引用
说明:如果在配置文件中的某个数据需要引用同文件中另一个数据,则采用SpEL表达式也可以做到引用的功能。
提示:yaml支持转义字符,但值必须用双引号包裹。
baseDir: c:\windows
tempDir: ${baseDir}\temp
3.6 读取yaml全部属性数据
说明:如果想要直接导入全部的配置文件数据,可以使用自动装配;具体方式是使用Enviromment
类,并且加上@Autowired
注解;在使用属性时,直接调Enviromment对象的getProperty方法,并传入对应属性读取的字符串,属性读取的方式和3.4中一致,但不需要再使用SpEL表达式。
package springboot_01_01_quickstart.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/books")
public class BookController {
@Autowired
private Environment env;
@GetMapping
public String getById(){
System.out.println("springboot is running");
System.out.println(env.getProperty("country"));
return "springboot is running";
}
}
3.7 读取yaml引用类型数据
引入:在引入配置文件中的属性时,我们更希望读取文件的某个部分而不是文件中全部的属性。
说明:使用类将配置文件中的属性封装起来是一个不错的方式。
步骤演示:
书写配置文件
datasource: driver: com.mysql.jdbc.Driver url: jdbc:mysql://localhost/springboot_db username: root password: 123456
创建一个MyDataSource类,该类必须含有配置文件需要封装的对象的全部属性,否则报错;其次,该对象应该交由IOC管理,故加上注解
Component
;最后,我们需要配置其前缀,也就是说到时候调用属性的时候,调用driver是谁的driver?是datasource的driver,故我们要加上注解ConfigurationProperties("datasource")
。package springboot_01_01_quickstart; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties("datasource") public class MyDataSource { private String driver; private String url; private String username; private String password; @Override public String toString() { return "MyDataSource{" + "driver='" + driver + '\'' + ", url='" + url + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + '}'; } public String getDriver() { return driver; } public void setDriver(String driver) { this.driver = driver; } public String getUrl() { return url; } public void setUrl(String url) { this.url = url; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
声明刚刚封装的数据对象,并使用@Autowired进行对象的自动装配。
package springboot_01_01_quickstart.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import springboot_01_01_quickstart.MyDataSource; @RestController @RequestMapping("/books") public class BookController { @Autowired private MyDataSource myDataSource; @GetMapping public String getById(){ System.out.println("springboot is running"); System.out.println(myDataSource); return "springboot is running"; } }