目录
在 springBoot 中很多重要的数据是需要通过配置文件进行配置的。
例如:项目启动的端口号,数据库的连接信息等。
配置文件的格式
在 springBoot 中配置文件有两种格式:一种为 properties,一种为 yml (yaml);
首先 properties 和 yml 配置文件是可以同时存在于项目中的。但如果在此项目中,这两个配置文件的某一个配置项是相同的时候,会以 properties 为主,也就是 properties 文件的优先级更高,但也会执行 yml 文件中的配置项;(通常情况下,也只会使用一个配置文件)
1. 配置项的分类和中文支持
在配置文件中,配置项一般有两种:
1. 系统配置项:项目端口号...
2. 用户自定义配置项:通过用户自己定于;
一般默认配置文件不支持中文的,需自行设置,在settings文件中对项目(一般需要针对此项目和新项目的两个settings都修改) 的encoding 都改为 UTF-8;
2. properties 配置文件
1. properties 配置文件是 sprinBoot 项目的默认配置文件,以 key=value 的格式进行配置;
# 配置项目的端口号
server.port=8080
# 数据库的配置项
spring.datasource.url=xxx
spring.datasource.username=xxx
spring.datasource.password=xxx
class=hello
读取配置文件
读取配置文件采取如下格式:
@Value("${class}") // "${}"
public String classR;
表示读取配置文件中 key 为 class 的值;
优缺点分析
1. 它是系统默认的配置文件;
2. properties 配置项的优先级比 yml 高;
3. 写法简单,不容易出错;
4. 但是写法有些冗余,例如上述数据库的配置中,spring.datasource重复写了三次,于是就引出了 yml;
3. yml 配置文件
yml的基本语法是:key: value ,需要注意的是 key 和 value 之间通过 :+空格 来间隔;空格不可省略!!!
且取代 spring 和 url 之间 . 的是换行缩进;
~ 表示 null;
spring:
datasource:
url: xxx
username: xxx
password: xxx
读取配置文件
读取方式跟 properties 的方式是一样的;
在 yml 配置文件还可以配置对象(注意要重写 setter 方法,因为要从配置文件中去获取对应的数值,使用 setter 方法赋值给当前的 Bean 对象),使用注解 @ConfigurationProperties("类名")从配置文件中获取
@ConfigurationProperties("student") // 从yml配置文件中获取类
@Component
@Setter // lombok
@ToString // lombok
public class StudentComponent {
public int id; // 属性名要和配置文件中的配置项相对应
public String name;
public int age;
}
@Controller // springBoot 不再需要像 spring 一样要在配置文件中说明了哪个路径下需要存入Bean,可以理解为扫描路径约定为启动类的路径下
@ResponseBody // 加在类上,表示当前类中的所有方法返回的都是非静态页面的数据 -> 返回的是数据而不是页面
public class TestController {
@Value("${mystr1}")
public String mystr1;
@Value("${mystr2}")
public String mystr2;
@Value("${mystr3}")
public String mystr3;
@Value("${student.name}") // 从配置文件中读取对应类的属性
public String name;
@Autowired // 从容器中读取对象
private StudentComponent studentComponent;
@PostConstruct // 初始化方法
public void doPostConstruct(){
System.out.println("-----------------------");
System.out.println(mystr1);
System.out.println(mystr2);
System.out.println(mystr3);
System.out.println("-----------------------");
System.out.println(name);
System.out.println(studentComponent);
}
}
也可以配置集合,使用到的注解和配置对象一样:
dbtypes: {name: [str1,str2,str3]}
@Component
@ConfigurationProperties("dbtypes") // 从配置文件中获取对应集合
@Data // lombok
public class ListComponent {
private List<String> name;
}
@Controller
@ResponseBody
public class TestController {
@Autowired
private ListComponent listComponent;
@PostConstruct // 初始化方法
public void doPostConstruct(){
System.out.println(listComponent.getName());
}
}
优缺点分析:
1. yml 格式就没有那么冗余了,可读性也更高;
2. yml支持更多种编程语言;
3. yml 支持的类型更多,还可以读取对象;
4. 但是格式需要多注意,以免出错;
4. 多个配置文件
在正常的开发环境中,会分为开发,测试,生产等多个环境,此时多个环境下,项目的一些 配置是不一样的,比如是端口号可能是不一致的,那么此时就需要到多个配置文件,不同的环境下对应一个配置文件,还需要一个总配置文件,写不同环境下相同的配置。那么此时就可以通过 总的配置文件来指定要执行哪个环境下的配置问价,不管执行哪个环境下的配置文件,总配置文件都会执行。
配置文件规则:
1. 必须有主配置文件,主配置文件名必须为 application.yml(properties);
2. 不同平台的配置文件,每个平台拥有一个配置文件 ,配置文件名要求为 application-xxx.后缀;
对于要执行哪个配置文件,通过在主配置文件中执行 ( action中的数值是 xxx ):
spring:
profiles:
active: test
此时执行的就是 application-test 配置文件和主配置文件。
5. properties 和 yml 的对比
1. 格式上:properties 是以 key=value 的形式配置的键值类型,而 yml 使⽤的是类似 json 格式的树形配置⽅式进⾏配置的,yml 层级之间使⽤换行缩进的方式配置,key 和 value 之间使用 (:+ 空格)的方式!!!2. properties 为早期并且默认的配置⽂件格式,但其配置存在⼀定的冗余数据,使⽤ yml 可以很好的解决数据冗余的问题;3. yml 通⽤性更好,⽀持更多语⾔,如 Java、Go、Python 等,也支持更多的数据类型;
更多的系统配置项:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html