1、位置问题
SpringBoot中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,比如数据库连接用户名、密码等,承载这些自定义配置的文件就是resources目录下的application.properties文件(也可以使用YAML配置来代替application。properties配置)。在前面Web容器配置章节中,我们已经见识到application.properties配置的基本用法了,现在我们来进一步了解application.properties。
SpringBoot项目中的application.properties配置文件一共可以出现在如下4个位置:
- 项目根目录下的config文件夹中;、
- 项目根目录下;
- classpath下的config文件夹中;
- classpath下。
如果这4个位置中都有application.properties文件,那么加载的优先级从1到4依次降低,如图所示,SpringBoot将按照这个优先级查找配置信息,并加载到Spring Environment中。
如果未使用application.properties,而是使用了application.yml作为配置文件,那么配置文件的优先级也与上图一致。
默认情况下,SpringBoot启动时,默认会按照上面那4个位置顺序去查找相关属性并加载,但是,这也不是绝对的,我们也可以在项目启动时自定义配置文件。
例如,现在在resources目录下创建一个csconfig目录,目录中存放一个application.properties文件,那么正常情况下,当我们启动项目时,这个配置文件是不会自动加载的。我们可以通过spring.config.location属性来手动指定配置文件位置,指定完成后,系统就会自动去指定目录下查找application.properties文件。
此时启动项目,就会发现项目以classpath:/csconfig/application.properties配置文件启动。
这是在开发工具中配置了启动位置,如果项目已经打包成jar,在启动命令中使用spring.config.location可以指定配置文件所在目录(注意需要以/结束),代码如下:
java -jar springbootdemo 0.0.1-SNAPSHOT.jar --spring.config.location=classpath:/csconfig/
2、文件名问题
对于application.properties而言,它不一定非要叫application,但是项目默认是去加载名为application的配置文件,如果我们的配置文件不叫application,也是可以的,但是,需要明确指定配置文件的文件名。
方式和指定路径一致,只不过此时的key是spring.config.name。
首先我们在resources目录下创建一个app.properties文件,然后在IDEA中指定配置文件的文件名:
指定完配置文件名之后,再次启动项目,此时系统会自动去默认的四个位置下面分别查找名为 app.properties 的配置文件。当然,允许自定义文件名的配置文件不放在四个默认位置,而是放在自定义目录下,此时就需要明确指定 spring.config.location 。
配置文件位置和文件名称可以同时自定义。
如果项目已经打包成jar,在启动命令中使用如下命令,代码如下:
java -jar springbootdemo 0.0.1-SNAPSHOT.jar --spring.config.name=app --spring.config.location=classpath:/
3、普通的属性注入
由于SpringBoot源自Spring,所以Spring中存在的属性注入,在SpringBoot中一样也存在。由于在SpringBoot中,默认会自动加载application.properties文件,所以简单的属性注入可以直接在这个配置文件中写。
例如,现在定义一个Book类:
package com.cs.entity;
public class Book {
private int id;
private String name;
private String author;
private double price;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
", price=" + price +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;