目录

  • 相关源码
  • 配置文件的默认位置
  • 配置文件的默认名称
  • 外部配置文件
  • springboot支持的配置文件格式
  • @Import、@ImportResource、@PropertySource 导入配置
  • springboot中的配置方式
  • 常见配置的加载顺序
  • 常见配置的优先级
  • bootstrap、application配置文件的区别



 

springboot源码版本 2.3.12.RELEASE
 

相关源码

ConfigFileApplicationListener 部分代码(已经过调整)

//指定配置文件的位置
public static final String CONFIG_LOCATION_PROPERTY = "spring.config.location";

//配置文件的默认位置,这也是从低到高的优先级顺序
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";

//指定额外的配置文件位置,spring.config.location + spring.config.additional-location 组成全部的配置文件位置
public static final String CONFIG_ADDITIONAL_LOCATION_PROPERTY = "spring.config.additional-location";


//指定配置文件名称
//会在指定配置文件目录下扫描,把名称为name、name-{active}、name-{include}的yaml、properties文件作为springboot的配置文件
public static final String CONFIG_NAME_PROPERTY = "spring.config.name";

//默认的配置文件名称
private static final String DEFAULT_NAMES = "application";


public static final String ACTIVE_PROFILES_PROPERTY = "spring.profiles.active";

public static final String INCLUDE_PROFILES_PROPERTY = "spring.profiles.include";

static {
	Set<String> filteredProperties = new HashSet<>();
	filteredProperties.add("spring.profiles.active");
	filteredProperties.add("spring.profiles.include");
	LOAD_FILTERED_PROPERTY = Collections.unmodifiableSet(filteredProperties);
}

 

配置文件的默认位置

按优先级从低到高依次为

  • classpath:/ classpath根目录下的配置文件
  • classpath:/config/ classpath /config目录下的配置文件
  • file:./ 项目根目录下的配置文件
  • file:./config/*/ 项目根目录下的conifg的子目录下的配置文件
  • file:./config/ 项目根目录下的conifg下的配置文件

同一个配置项,高优先级中的会覆盖低优先级中的配置。
 

注意

springboot能够读取xx位置的配置文件,和maven打包时能把该位置的配置文件打包进去,这是两码事。

eg. 在IDEA中调试时,springboot能读取到项目根目录下的配置文件,但maven package时默认不会打包根目录下的配置文件,需要在pom.xml中修改maven的打包配置。

 

配置文件的默认名称

可通过 spring.config.name 设置配置文件名称,默认为 application

 

外部配置文件

外部化配置:把频繁修改的配置文件作为外部配置文件,不打到jar包中,启动应用时 spring.config.additional-location 指定额外的配置文件位置,这样修改外部配置文件的内容后,无需重新打jar包。
 

pom.xml

<build>

    <resources>
        <!-- src/main/resources配置 -->
        <resource>
            <directory>src/main/resources</directory>
            <!--排除不需要的配置文件-->
            <excludes>
            	<!--只能排除文件,不能直接排除某个目录-->
            	<!--可以使用多个exclude,可以使用通配符-->
                <exclude>*.yml</exclude>
                <exclude>logback-spring.xml</exclude>
            </excludes>
        </resource>
    </resources>

</build>

 

启动

# spring.config.additional-location指定额外的配置文件
java -jar xxx.jar --spring.config.additional-location=/app/mall/config/xxx.yml

#可以指定具体的配置文件,也可以指定文件夹,会自动使用其中的 application、application-{profile} 配置文件
#指定文件夹时,路径末尾必须是 /
java -jar xxx.jar --spring.config.additional-location=/app/mall/config/


#springboot提供了一个logging.config 可用于指定配置日志的xml文件
java -jar xxx.jar --spring.config.additional-location=/app/mall/config/xxx.yml --logging.config=/app/mall/config/logback-spring.xml

spring.config.additional-location 是用于指定外部配置文件的,在application.yml中直接使用这个属性无效,只能在命令行指定。

命令行参数可以用 - - 或 -D 来设置。

如果所有配置文件都要作为外部配置文件,也可以直接在命令行用 spring.config.location 指定配置文件位置。

 

springboot支持的配置文件格式

相关问题

  • springboot支持哪些格式的配置文件?
  • springboot中有哪几种配置文件?
  • yaml文件有什么优点?
     

springboot支持 properties、yaml格式的配置文件,相比于传统的 properties 配置文件,yaml 的优点在于 结构化配置、层次清晰明了,更推荐、更常用。yaml文件的后缀写成yaml、yml均可。

springboot也支持xml配置文件,在引导类上用 @ImportResource 导入xml配置文件即可。

 

@Import、@ImportResource、@PropertySource 导入配置

  • @Import:用于导入java类定义的配置,相当于 @Configuration 的功能。
  • @ImportResource:用于导入xml配置文件。
  • @PropertySource:用于导入xml、properties、yml配置文件。
//值是 Class[] 形式,不用在这些类上加 @Configuration 之类的@Component系列注解,会自动把这些类作为组件|bean放到容器中
@Import(ConfigService.class)
@Import({ConfigService.class, RegisterService.class})
@Configuration  //需要用@Component系列的注解放到容器中
@ImportResource("classpath:config/acme/db-config.xml")  //locations、value 互为别名,值是String[]形式,classpath路径要加前缀classpath: 相对、绝对路径要加前缀file:
@Data
@Configuration  //用@Component系列的注解放到容器中
@ConfigurationProperties(prefix = "wechat")
@PropertySource("classpath:external/wechat.yml") //指定配置文件位置,String[]形式,可以使用${}取值,classpath路径需要加前缀classpath: 相对/绝对路径需要加前缀file:
// @PropertySource("file:/usr/app/config/external/wechat.yml")
// @PropertySource("classpath:external/wechat-${spring.profiles.active}.yml")
public class WechatConfig {

    private String appId;

    private String secretKey;

}

 

springboot中的配置方式

相关问题

  • springboot有哪些配置方式?
  • springboot支持哪几种配置方式?
     

主要有4种

  • springboot提供的自动配置(默认配置)
  • 配置文件,properties、yaml、xml
  • 通过java代码进行配置,比如配置类、注解
  • 命令行参数

 

常见配置的加载顺序

  • bootstrap.properties|yml
  • 应用本身的 application-{profile}.properties|yml
  • 依赖的jar包中的 application-{profile}.properties|yml
  • 应用本身的 application.properties|yml
  • 依赖的jar包中的 application.properties|yml
  • @Configuration配置类

 

常见配置的优先级

命令行参数的优先级最高,bootstrap配置的优先级高于application。

相同位置,具体环境的配置优先级高于整体配置,即 application-{profile} > application。

相同位置、相同文件名,properties文件的优先级高于yaml。

 

bootstrap、application配置文件的区别

springboot有2种上下文,对应springboot的2个核心配置文件

  • bootstrap 引导上下文:通过bootstrap.yml进行配置
  • application应用上下文:通过application.yml进行配置

bootstrap是在springloud中使用的,加载时机在application之前,应用启动时,会先加载解析bootstrap.yml,创建引导上下文,由引导上下文加载、解析application.yml,创建应用上下文。

bootstrap通常在springcloud中使用,常用于从外部源加载配置,比如springcloud config、nacos,或一些加解密场景,普通的springboot项目一般用不到bootstrap。