SpringBoot 十二种配置文件的读取方式,有你不知道的吗?

2,342 阅读4分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情

一、配置文件读取方式 右低到高

1-1、通过添加注解@PropertySource/@Configuration设置配置文件

我们可以通过在启动类上加上@PropertySource/@Configuration注解来设置读取的配置文件

1-1-1、添加配置文件appSource.properties

image.png

1-1-2、添加注解读取配置文件

image.png

1-1-3、启动测试

通过下图可以发现,端口号还是读取application.properties中的端口,但是appSource.properties中的虚拟项目名称会进行互补 image.png

特点

a. 会和约定的配置文件形成互补
b. 一定要指定.properties配置

@PropertySource("classpath:appSource.properties")

请注意,Environment在刷新应用程序上下文之前,不会将此类属性源添加到中。现在配置某些属性(如logging.*和spring.main.*在刷新开始之前先读取)为时已晚。

1-2、设置默认属性设置配置文件

通过设置指定SpringApplication.setDefaultPropertess

1-2-1、首先创建一个自定义配置文件app.properties

名称定义为app.properteis,按照springboot读取规则,是不默认读取的,我们先设置端口和虚拟项目目录

image.png

1-2-2、修改application.properties

设置了端口号 image.png

1-2-3、修改启动类,使用ClassLoader加载自定义配置文件

@PropertySource("classpath:appSource.properties")
@SpringBootApplication
public class Application {

    public static void main(String[] args) throws IOException {
        SpringApplication springApplication=new SpringApplication(Application.class);

        //创建Properties对象
        Properties properties=new Properties();
        //通过当前类的ClassLoader读取配置文件
        InputStream is=Application.class.getClassLoader().getResourceAsStream("app.properties");
        //将输入流读取Properties对象
        properties.load(is);

        springApplication.setDefaultProperties(properties);
        springApplication.run(args);
    }

}

1-2-4、启动程序,查看结果

可以看到,虽然在启动类设置了读取app.properteis配置文件,但是springboot还是优先读取application.properties,但同时也读取了app.properties中的配置信息,并且进行互补。

image.png 由此可以看到,虽然通过注解也配置了虚拟项目目录,但是实际使用的是通过设置默认读取配置文件的信息,因此优先级高于注解设置的配置文件。

特点

会和约定的配置文件形成互补

1-3、配置数据文件

指放于项目跟目录下面的配置文件,如application.properties(yml/ymal),此为约定配置文件,通过上面测试,如果设置了约定配置文件设置了端口号,则通过设置默认读取文件以及通过注解设置的配置文件都不起作用。

1-4、设置环境变量

设置环境变量有两种方式,一种是通过idea或者使用操作系统环境变量

1-4-1、使用idea设置

1-4-1-1、直接设置配置信息

1、配置相关信息

image.png

2、直接设置端口号信息

image.png

3、测试-可以看到已经读取了环境变量的值

image.png

1-4-1-2、设置读取配置文件

1、在d:/config下创建application.properties文件,并设置端口号为8085

1-4-1-2-1、配置idea

spring.config.location=D:\config/ 需要注意的是,如果最后一级为文件夹需要是反斜杠 image.png

1-4-1-2-2、测试

可以看到端口号已经为8085,可以看到虚拟目录为jonyDefault,这是由于设置了默认读取配置文件和注解配置文件,并且设置的默认配置文件优先级高,如果将两个配置文件都去掉,给application.properties添加虚拟目录是不起作用的,此时不会和约定的文件互补 image.png

1-4-2、使用windows设置环境变量

1-4-2-1、首先设置环境变量

set spring.config.location=D:\config/

清除环境局变量可以使用

set spring.config.location=

查看所有环境变量

set

1-4-2-2、启动项目测试

将项目打包并执行命令

java ‐jar 02_extern_config‐0.0.1‐SNAPSHOT.jar

此时读取也是我们设置8085端口号,并且可以和设置的default和注解配置文件互补,但是不会和约定配置文件互补

1-5、java系统的属性(System.getProperties())

此方式也会使约定配置文件失效,和default和注解的配置文件互补

1-5-1、使用idea设置

需要注意的是首字母D一定要大写

1-5-1-1、直接设置

image.png

1-5-1-2、测试执行

image.png

1-5-1-2、设置读取配置文件

依然在VM option设置

‐Dspring.config.location=D:\config/

1-5-2、java命令行设置属性

java ‐Dspring.config.location=D:\config\application‐java.properties ‐jar 02_extern_config‐0.0.1‐SNAPSHOT.jar

1-6、JNDI属性java:comp/env

这个基本用不到,就不做讲解演示了

1-7、ServletContext 初始化参数。

此配置需要配置到web.xml中,但由于springboot内嵌了tomcat,没有web.xml,后面再进行叙述 ServletContext 的配置标签需要写到 web‐app (根标签)中 ,具体如下:

<context‐param>
 <param‐name>spring.config.location</param‐name>
 <param‐value>xxx.properties</param‐value>
</context‐param>

1-8、ServletConfig 初始化参数。

ServletConfig 的配置标签需要写到 Servlet 标签中,标签如下:

<init‐param>
 <param‐name>spring.config.location</param‐name>
 <param‐value>xxx.properties</param‐value>
</init‐param>

1-9、来自的属性SPRING_APPLICATION_JSON(嵌入在环境变量或系统属性中的嵌入式JSON)。

java -Dspring-application.json '{"server":{"port":"8087"}}' -jar myapp.jar

1-10、命令行参数。

会使约定配置文件失效,优先级最大

java ‐jar 02_extern_config‐0.0.1‐SNAPSHOT.jar ‐‐spring.config.location=D:/application.properties

1-11、properties测试中的属性

可用于测试应用程序的特定部分@SpringBootTest的测试注释和注释。

image.png

1-12、$HOME/.config/spring-boot当devtools处于活动状态时,目录中的Devtools全局设置属性。

这个也基本不用,具体可以看下spring官网