Spring Boot 中采用了大量的自动化配置,但是对开发者而言,在实际项目中不可避免会有一些需要自己手动配置,承载这些自定义配置的文件就是resources目录下的application.properties文件(也可以使用 application.yaml 文件替代 application.properties 文件)。
Spring Boot项目中的 application.properties 配置文件一共可以出现在如下4个位置:
这四个位置的加载优先级依次为 1 > 2 > 3 > 4。如果这4个位置中都有application.properties文件,那么加载的优先级从1到4依次降低,如下图所示。Spring Boot将按照这个优先级查找配置信息,并加载到Spring Environment 中。
默认情况下,Spring Boot 查找 application.properties 并加载。如果开发者不想使用 application.properties 作为配置文件名,也可以自己定义。在打包启动时指定文件的路径或名称。
1、项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定文件名。
java -jar xxx.jar --spring.config.name=filename
2、项目打包好以后,我们可以使用命令行参数的形式,启动项目的时候来指定外部配置文件的位置。
java -jar xxx.jar --spring.config.location=classpath:/app.properties
3、当然我们也可以指定外部配置所在的文件夹,启动时会搜索并使用该文件夹下的配置文件:
java -jar xxx.jar --spring.config.location=classpath:/config/
4、我们还可以同时配置多个路径,比如下面样例先加载外部配置文件,如果不存在外部配置文件的话则使用包内默认的配置文件:
java -jar xxx.jar --spring.config.location=classpath:/,classpath:/config/
除了可在配置文件中配置属性参数外,还可以通过例如在二中指定配置文件路径的形式指定启动参数,比如在集群环境下,在配置文件中指定了 端口为 8080,如果想再启动一个 8081 端口的服务,就可以通过 --server.port指定启动端口。其他参数同理
java -jar xxx.jar --server.port=8081
如果 application.properties 文件中已经存在了同名的参数,将会覆盖 application.properties 中配置的。
在项目中经常会遇到肯定自定义的配置属性,比如 Token 过期时间、调度任务的定时时间等信息。我们可以在 application.properties 中配置自己的属性。
1、我们可以在 application.properties 中添加类似如下这样简单的常量配置:
book.name=红楼梦
book.author=曹雪芹
book.price=299.9
2、配置属性之间也可以相互引用使用:
book.name=红楼梦
book.author=曹雪芹
book.price=299.9
# book.info 属性引用了以上三个属性
book.info=${book.name}-${book.author}-${book.price}
3、将配置属性数据注入到类属性上。
(1)、在需要使用地方通过 @Value 注解就可以将数据注入到属性上,如下所示我们创建一个 BookController 把 book.info 注入到 bookInfo 属性上。
@RestController
public class BookController {
@Value("${book.info}")
private String bookInfo;
@GetMapping("/book")
public String boolInfo(){
return bookInfo;
}
}
(2)、重启项目,访问 http://localhost:8081/book。
4、将属性数据注入到Bean上。
在项目开发中可能存在一个或多个配置在多个类中都会使用到,如果在每个使用到的类中都加上同一一个属性,或者每个属性都散落在项目中的类中,维护起来相对比较麻烦,我们也单独定义一个配置类,把自定义的属性都注入到这个配置类中,其他使用的属性直接引用这个类即可。
(1)、定义一个 名为 Book 的 Bean,并将前面的配置数据注入到这个 Bean 中
@ConfigurationProperties(prefix = "book")
@Component
public class Book {
private String name;
private String author;
private Double price;
private String info;
// 省略 getter 和 setter 方法
}
说明:
(1)@ConfigurationProperties 中的 prefix 属性描述了要加载的配置文件的前缀。
(2)Spring Boot 采用了一种宽松的规则来进行属性绑定:
- 假设 Bean 中的属性名为 authorName,那么配置文件中的属性可以是 my.author_name、my.author-name、my.authorName 或者 my.AUTHORNAME
(2)、在 BookController 中注入 Book
@RestController
public class BookController {
@Resource
private Book book;
@GetMapping("/book")
public String boolInfo(){
return book.getInfo();
}
}
(3)、重启访问
开发者在项目发布之前,一般需要频繁地在开发环境、测试环境以及生产环境之间进行切换,这个时候大量的配置需要频繁更改,(比如:数据库、redis、mongodb,MQ等配置)。频繁修改带来了巨大的工作量,Spring Boot中约定的不同环境下配置文件名称规则为:
- application-{profile}.properties,profile占位符表示当前环境的名称。
具体配置步骤如下。
1、创建配置文件
首先在 resources 目录下创建两个配置文件:application-dev.properties 和 application-prod.properties,分别表示开发环境和生产环境中的配置。
#application-dev.properties
book.name=红楼梦
book.author=曹雪芹
book.price=299.9
# book.info 属性引用了以上三个属性
book.info=${book.name}-${book.author}-${book.price}
#application-prod.properties
book.name=MySQL从删库到跑路
book.author=佚名
book.price=299.9
# book.info 属性引用了以上三个属性
book.info=${book.name}-${book.author}-${book.price}
2、在 application.properties 中配置环境
(1)在 application.properties 中进行如下配置,则表示 加载 application-dev.properties
spring.profiles.active=dev
(2)在 application.properties 中进行如下配置,则表示 加载 application-prod.properties
spring.profiles.active=prod
(3)修改配置重启后则会访问,则会看到不同的结果
3、在代码中配置
对于第二步在application.properties中添加的配置,我们也可以在代码中添加配置来完成,在启动类的main方法上添加如下代码,可以替换第二步的配置:
@SpringBootApplication
public class Springdemo3Application {
public static void main(String[] args) {
SpringApplicationBuilder builder =
new SpringApplicationBuilder(Springdemo3Application.class);
builder.application().setAdditionalProfiles("dev");
builder.run(args);
}
}
4、项目启动时配置
我们也可以在项目打包成 jar 包后启动时,在命令行中动态指定当前环境:
java -jar xxx.jar --spring.profiles.active=dev
5、通过 Maven 指定
上述所说的三种配置,都需要在打包前修改配置或者在启动时指定启动参数,我们还可以通过 Maven 指定配置,在打包时直接打入指定的配置。
(1)、修改 pom.xml 文件中添加如下配置
org.springframework.boot
spring-boot-maven-plugin
org.apache.maven.plugins
maven-resources-plugin
src/main/resources
true
application-dev.properties
application-prod.properties
src/main/resources
false
application-${profiles.active}.properties
application.properties
dev
dev
true
true
prod
prod
true
(2)、修改 application.properties 文件,添加如下配置:
[email protected]@
(3)、在 maven 打包时指定 profile。
mvn clean package -P prod
这样打包后的文件就只有 指定 profile 对应的文件,如下所示: