Skip to content

SpringBoot 配置详解

1. 默认加载配置

SpringBoot 使用两种全局的配置文件,全局配置文件可以对一些默认配置进行修改。

  • application.properties

  • application.yml

这两个配置文件是我们 springboot 启动的时候会默认加载的配置文件。

配置文件放在 src/main/resources 目录或者类路径 /config 下,这个配置文件的路径是有优先级的,优先级后面章节再说。

1.1 properties 文件

SpringBoot 不需要添加复杂的 web.xml 或者 spring.xml 等配置文件,SpringBoot 只有一个配置文件,也非必须的;默认的配置文件是 application.properties,配置格式如下所示:

properties
#修改端口号
server.port=8888
#定义项目的访问目录
server.context-path=/springboot

1.2 yaml 文件

除了默认的 properties 文件,SpringBoot 还提供另外一种配置文件 yml,这种文件提供一种更加简洁的方式编写配置信息。

yml 是一种标记语言,以数据为中心,比 json、xml 等更适合做配置文件,其基本语法如下:

  • 以键值对的方式表示属性。(冒号:后面的空格必须有)

  • 使用缩进表示层级关系,缩进时不允许使用 Tab 键,只允许使用空格

  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可

  • 属性和值是大小写敏感的

yml 配置示例:

yml
server:
    port: 8081
    servlet:
        context-path: springboot

1.2.1 yaml 语法

YAML 支持的三种数据结构。

  • 字面量:普通的值。(数字,字符串,布尔)

  • 对象:键值对的集合。(Map)

  • 数组:一组按次序排列的值。(List,Set)

字面量

YAML 中字面量属于普通的值。以 key: value 来表示,value 前必须带一个空格。

字面量,字符串默认不需要单双引号;带双引号会转义字符,特殊字符会被转义;带单引号不会转义字符,特殊字符不会被转义。

对象 Map

在 YAML 中,对象和 Map 都是以键值对的方式表示。在下一行来编写属性和值得关系,注意缩进。

yml
users:
  firstName: SimpleWu
  email: lovelyWu98k@gmail.com

对象还有另一种写法:

yml
users: {
    firstName: zhangsan,
    email: lovelyWu98k@gmail.com
}

数组

-值 得方式来表示数组中的一个元素。

yml
users:
    - SimpleWu
    - lovelyWu98k@gmail.com
    - addressisnot

另外一种写法:

yml
users: [SimpleWu,lovelyWu98k@gmail.com,addressisnot]

1.3 将配置映射到实体类

springboot 支持我们直接将 properties 或者 yml 中的属性映射到某个实体类,看例子:

yml
mysql:
    url: jdbc:mysql:///springboot
    port: 3306
    user: root
    pass: root

假如在资源中我们现在有个 mysql 的链接信息,我们如何将它映射到实体类中去呢?有两种方式:

方式一:@ConfigurationProperties

@ConfigurationProperties 指定从配置文件中读取属性,prefix 指定对应 yaml 文件中的名称,示例代码:

java
@ConfigurationProperties(prefix = "mysql")
@Component
public class MySQLInfo {
    private String url;
    private Integer port;
    private String user;
    private String pass;
    //省略getset
}

我们只需要指定 prefix 即可,他就会加载我们 yml 配置前缀为 mysql 的属性。

i 使用 IDEA 当我们添加了 @ConfigurationProperties 注解后,在页面上会出现一个错误提示,我们需要加入依赖。

xml
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

方式二:@Value

如果我们使用这个注解来获取属性,使用方式是:

java
@Component
public class MySQLInfo {
    @Value("${mysql.url}")
    private String url;
    @Value("${mysql.port}")
    private Integer port;
    @Value("${mysql.user}")
    private String user;
    @Value("${mysql.pass}")
    private String pass;
    //省略getset
}

w 注意:如果需要使用表达式只有 @Value 才可以,比如:@Value("#{10*2}) 结果为:20

两种方式的区别:

功能点@ConfigurationProperties@Value
功能批量注入配置文件中的属性一个个指定
松散绑定支持属性名必须完全匹配
SPEL 表达式不支持支持
JSR303 效验支持不支持
复杂类型支持不支持

两种方式的适用场合:

当只需要为某个值提供注入时,推荐使用 @Value 方式。

当需要对整个对象的整体进行赋值时,使用 @ConfigurationProperties 方式。

2. 加载外部配置文件

如果我们将所有的配置信息都写在 application.yml 文件中,则到时候 yml 文件会变得非常庞大,不太方便我们进行维护。我们可以对配置中的内容进行拆分,拆分到多个文件中,这样就提高了配置的可维护性。

2.1 加载方式

引入外部配置文件有以下几种方式:

  1. @PropertySource(value={"classpath:student.properties"}):需要注入的类的前面使用该注解

  2. @ImportResource(locations={"classpath:spring.xml"}:在启动的 SpringBootApplication 前面使用该注解

  3. @Configuration 和 @Bean方式:添加一个自定义配置类

java
@Configuration
public class MyConfig {
    @Bean
    public MySQLInfo mySQLInfo(){
        return new MySQLInfo();
    }
}

2.2 切换多个外部配置文件

真实环境中,有时候需要配置多个配置文件,不同的环境使用不同的配置,此时就可以使用 spring.profile.active 来进行切换。

比如现在我们有三个配置文件:application.ymlapplication-dev.ymlapplication-prod.yml

我们在 application.yml 中通过 spring.profile.active = dev(prod)来选择需要加装的配置文件。

或者我们可以通过 maven 将项目打成 jar 包通过命令行使用以下命令来指定环境:

shell
java –jar springboot02-0.0.1-SHAPSHOT.jar –spring.profiles.active=dev

2.3 配置文件加载位置和顺序

springboot 启动会扫描以下位置的配置文件作为 springboot 的默认配置文件:

  • 项目路径下的 config 文件夹

  • 项目跟路径下

  • classpath 路径下 config 文件夹

  • classpath 路径下

以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,如果冲突的情况,高优先级配置内容会覆盖低优先级配置内容。如果不冲突,形成互补配置。

我们也可以通过配置 spring.config.location 来改变默认配置。使用命令行方式加载,否则优先级不够。

shell
java –jar xxxx.jar –spring.config.location=配置文件路径

SpringBoot 也可以从以下位置加载配置;优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置形成互补配置。

  • 命令行参数

  • 来自 java:comp/env 的 JNDI 属性

  • Java 系统属性(System.getProperties())

  • 操作系统环境变量

  • RandomValuePropertySource 配置的 random.* 属性值

  • jar 包外部的 application-{profile}.properties 或 application.yml (带 spring.profile) 配置文件

  • jar 包内部的 application-{profile}.properties 或 application.yml (带 spring.profile )配置文件

  • jar 包外部的 application.properties 或 application.yml (不带 spring.profile) 配置文件

  • jar 包内部的 application.properties 或 application.yml (不带 spring.profile) 配置文件

  • @Configuration 注解类上的 @PropertySource

  • 通过 SpringApplication.setDefaultProperties 指定的默认属性