MENU

Spring Boot 之外置配置

June 25, 2017 • Read: 1362 • Spring

Spring Boot 之 Configuration中,已经了解自动配置的基本原理,通过基本配置可以实现很多功能,让我们更关注业务本身;但是不可避免需要自定义配置,比如将自动配置的8080端口修改为8081,或者配置数据源信息等等。

Spring Boot支持多种方式外置配置,比如环境变量、Java系统属性、JNDI、命令行参数或者属性文件等。以最简单的修改Tomcat监听端口为例。

使用命令行参数--server.port=8081,启动项目;监听端口已经为8081。

Tomcat started on port(s): 8081 (http)

image

最常见的方式是使用配置文件application.yml或者application.properties;在resources目录下创建application.yml:

server:
    port: 9090

再次启动项目,可能会发现监听的依然是8081端口;这是因为刚才的命令行参数没有删除导致的,删除命令行参数再启动程序,就是监听9090端口。

优先级

当多种方式配置同一个配置项时,是存在优先级;从配置端口这个例子可知,命令行参数的优先级要高于配置文件的优先级。

优先级有高到低依次为:

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的random.*属性值
  6. jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  7. jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
  8. jar包外部的application.properties或application.yml(不带spring.profile)配置文件
  9. jar包内部的application.properties或application.yml(不带spring.profile)配置文件
  10. @Configuration注解类上的@PropertySource
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

application.properties和application.yml文件可以放在以下四个位置:

  1. 外置,在相对于应用程序运行目录的/config子目录
  2. 外置,在应用程序运行的目录
  3. 内置,在config包内
  4. 内置,在Classpath根目录

同样,优先级顺序为由高到低。/config子目录里的application.properties会覆盖应用程序classpath里的application.properties中的相同属性。

使用Profile

程序部署到不同环境时通常使用不同的配置;比如在本地环境会关闭Thymeleaf模认缓存,方便开发调试、在测试环境和生产环境会配置不同的数据库链接。

在yml文件中,使用三个减号(---)分隔不同环境的配置,spring.profile设置环境名称,激活指定的profile使其生效;server.port配置未指定profile,所以它在所有环境下都会生效。

server:
    port: 9090

---
spring:
    profiles: development #开发环境

    thymeleaf:
        cache: false

---
spring:
    profiles: production #生产环境

    thymeleaf:
        cache: true

如果配置项比较多,多个环境配置放在同一个yml文件里可读性比较差;我们为每个环境建立独立配置文件,以上面的开发、生产环境配置为例;我们需要再建两个yml文件application-development.ymlapplication-production.yml。文件命名规则为application-{profile},在配置文件中无需再次指定spring.profiles了。

spring:
    thymeleaf:
        cache: false

除了配置文件,我们还可以直接用@Profile注解来进行配置:

@Configuration
@Profile("production")
public class ProductionConfiguration {
    // ...
}

注解的方式使用不太方便,还是推荐使用application-{profile}方式。

激活profile也非常简单,在application.yml中增加配置:

spring:
    profiles:
        active: development

使用命令行参数--spring.profiles.active=development也是可以的,可以参照开头提到的配置属性优先级。

在idea中启动项目,修改下thymeleaf模板文件,rebuild(ctrl + shift + F9 )一下,再次访问发现修改内容生效了;切到production环境,rebuild后并不会生效,只有重启项目才会生效。

Last Modified: September 21, 2017