一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第26天,点击查看活动详情。
一、配置文件读取方式 右低到高
1-1、通过添加注解@PropertySource/@Configuration设置配置文件
我们可以通过在启动类上加上@PropertySource/@Configuration注解来设置读取的配置文件
1-1-1、添加配置文件appSource.properties
1-1-2、添加注解读取配置文件
1-1-3、启动测试
通过下图可以发现,端口号还是读取application.properties中的端口,但是appSource.properties中的虚拟项目名称会进行互补
特点
a. 会和约定的配置文件形成互补
b. 一定要指定.properties配置
@PropertySource("classpath:appSource.properties")
请注意,Environment在刷新应用程序上下文之前,不会将此类属性源添加到中。现在配置某些属性(如logging.*和spring.main.*在刷新开始之前先读取)为时已晚。
1-2、设置默认属性设置配置文件
通过设置指定SpringApplication.setDefaultPropertess
1-2-1、首先创建一个自定义配置文件app.properties
名称定义为app.properteis,按照springboot读取规则,是不默认读取的,我们先设置端口和虚拟项目目录
1-2-2、修改application.properties
设置了端口号
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中的配置信息,并且进行互补。
由此可以看到,虽然通过注解也配置了虚拟项目目录,但是实际使用的是通过设置默认读取配置文件的信息,因此优先级高于注解设置的配置文件。
特点
会和约定的配置文件形成互补
1-3、配置数据文件
指放于项目跟目录下面的配置文件,如application.properties(yml/ymal),此为约定配置文件,通过上面测试,如果设置了约定配置文件设置了端口号,则通过设置默认读取文件以及通过注解设置的配置文件都不起作用。
1-4、设置环境变量
设置环境变量有两种方式,一种是通过idea或者使用操作系统环境变量
1-4-1、使用idea设置
1-4-1-1、直接设置配置信息
1、配置相关信息
2、直接设置端口号信息
3、测试-可以看到已经读取了环境变量的值
1-4-1-2、设置读取配置文件
1、在d:/config下创建application.properties文件,并设置端口号为8085
1-4-1-2-1、配置idea
spring.config.location=D:\config/
需要注意的是,如果最后一级为文件夹需要是反斜杠
1-4-1-2-2、测试
可以看到端口号已经为8085,可以看到虚拟目录为jonyDefault,这是由于设置了默认读取配置文件和注解配置文件,并且设置的默认配置文件优先级高,如果将两个配置文件都去掉,给application.properties添加虚拟目录是不起作用的,此时不会和约定的文件互补
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、直接设置
1-5-1-2、测试执行
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的测试注释和注释。
1-12、$HOME/.config/spring-boot当devtools处于活动状态时,目录中的Devtools全局设置属性。
这个也基本不用,具体可以看下spring官网