目录
- 相关源码
- 配置文件的默认位置
- 配置文件的默认名称
- 外部配置文件
- 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。