配置文件

SpringBoot默认会从以下几个位置加载配置文件application.properties(或application.yml):

1、当前目录下的配置文件子目录:与xx.java同级的config\xxx.properties
2、当前文件夹:与xxx.java同级的xxx.properties
3、类路径下的配置文件子目录:classtpath:/config/xxx.properties
4、类路径下(classpath:根路径):classtpath:xxx.properties

上面的列表按数字大小分优先级,数字越小,优先级越高;同优先级时application.properties文件比application.yml文件优先级高

如果配置文件的名称不是默认的,可以通过spring.config.name属性指定配置名称

如果配置文件的路径不是默认路径,可以通过spring.config.location属性指定

profile

spring boot支持多环境属性配置,在开发时我们往往会使用多套的属性,开发时用一套属性的值、测试时一套、发布时又用一套,所以就需要配置不同的环境来应对这种变换。

我们可以命名时在使用 在文件名称中添加profile参数,类似下面这种(下面是以YML文件为例,properties文件也是同样的,使用properties文件的规则即可)

  • application-dev.yml
  • application-test.yml
  • application-prod.yml

然后在主配置文件application.yml中指定需要使用哪一套配置文件中的属性值

spring:
  profiles:
    # active: dev  #直接在配置中写死,指定用dev这套配置
    active: @profileName@ #maven打包时(maven package -P profile)指定的profile,会自动替换掉这里的占位符

启用指定的profile配置

spring boot命令行启动时指定profile
java -jar xxxx.jar -spring.profiles.active=test 
maven打包时指定profile

使用这种方式需要在pom文件中添加下面的这些设置

<!-- 配置maven打包时-P参数支持哪些profile -->
<profiles>
    <!-- 开发环境 -->
    <profile>
        <id>dev</id>
        <properties>
            <profileName>dev</profileName>
        </properties>
        <!-- 如果打包时没有指定-P参数,默认使用activeByDefault为true的profile -->
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
    </profile>
    <!-- 测试环境 -->
    <profile>
        <id>test</id>
        <properties>
            <profileName>test</profileName>
        </properties>
    </profile>
    <!-- 生产环境 -->
    <profile>
        <id>prod</id>
        <properties>
            <profileName>prod</profileName>
        </properties>
    </profile>
</profiles>
<build>
    <plugins>
<!-- maven resource插件功能: 主要是操作配置文件相关。比如用maven中的变量替换项目中配置文件中的占位符,显示指定非maven标准resources目录为resources -->
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.7</version>
            <configuration>
                <!-- 指定配置文件中的占位符是@ -->
                <delimiters>
                    <delimiter>@</delimiter>
                </delimiters>
                <useDefaultDelimiters>false</useDefaultDelimiters>
            </configuration>
        </plugin>
    </plugins>
</build>

有了上面的配置之后就可以适用maven的命令来控制要使用的环境

maven clean package -Dmaven.test.skip=true -P dev

代表打包时启用dev(开发)环境的配置,其实有了这个插件就可以不使用maven的命令来启用环境的配置,如下图所示

maven资源管理插件

直接在配置文件中写死

在application.yml中通过下面的属性

spring:
  profiles:
    active: dev  #直接在配置中写死,指定用dev这套配置

写死的方式指定要启用的profile(只适合开发环境)

支持的属性清单

由于官方给出的支持的属性清单内容非常多,所以这里就不一一展示了,需要使用的同学通过下面的传送门去查阅

传送门:官方配置属性清单

类型安全的Properties读取

当系统中参数值很多时,我们往往会将配置参数分门别类,然后通过@ConfigurationProperties注解直接将读取到的值封装到一个JavaBean上

示例

src/main/resources下新建config.properties

demo.phone=10086
demo.wife=self

创建ConfigBeanProp类并注入config.properties中的值:

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;

/**
 * 注:本类只是演示怎么读取自定义的配置文件,数据源还是直接通过Spring通过类型安全方式直接将读取到的属性封
 * 装到POJO类上省去了在每个属性上写@Value注解。适用于属性比较多,都以指定前缀开始的属性读取
 *
 * @author 召
 */

@Component
@ConfigurationProperties(prefix = "demo")
@PropertySource(value = "config.properties")
public class ConfigBeanProp {

    private String phone;
    private String wife;
    
    /** 
    * 省略Set、Get方法
    */
}

@Value注解读取application.properties参数

还是使用上面的例子,上面的方式适用的是属性很多,但是有共同的前缀。而@Value注解更多是应用于属性很少,或者没有共同的前缀的方式。

@Component
@PropertySource(value = "config.properties")
public class ConfigBeanProp {

    @Value("${demo.phone}")
    private String phone;
    
    @Value("${demo.wife}")
    private String wife;
    
    /** 
    * 省略Set、Get方法
    */
}

设置日志级别

logging:
  level:
    root: info # 设置全局日志显示info级和info级以上
    org.hibernate: ERROR # 设置这个包中的文件的日志显示ERROR级和ERROR级以上的
    org.springframework.web: DEBUG # 设置这个包中的文件的日志显示DEBUG级和DEBUG以上级的