外部配置(非常重要)
先看官网怎么说吧
中文翻译:
优先级从高到低(本文只解释较为常用的):
- 命令行参数(所以我们java -jar启动时指定的参数优先级最高啊)
所有的配置都可以在命令行上进行指定;
多个配置用空格分开;--配置项=值
--server.port=8087 --server.context-path=/abc
- Java系统属性(System.getProperties())
由此课件,Spring启动的时候,默认会把系统的很多属性都默认加载进来。
@Test public void contextLoads() { //看看spring容易里面是否存在系统属性 System.out.println(environment.containsProperty("user.name")); System.out.println(environment.containsProperty("java.runtime.name")); System.out.println(environment.containsProperty("user.dir")); System.out.println(environment.containsProperty("os.name")); System.out.println(environment.containsProperty("sun.boot.library.path")); //打印系统的所有属性(很多的系统属性) Properties properties = System.getProperties(); for (Map.Entry<Object, Object> entry : properties.entrySet()) { System.out.println(entry); } } 输出: 一路true
Tips:因此你自定义key的时候,应该去避免和系统自带的key重名,否则不起作用。
操作系统环境变量(比如操作系统的username等等,下面讲@Value的时候会介绍这个坑)
RandomValuePropertySource配置的random.*属性值
jar包外部的application-{profile}.properties配置文件
jar包内部的application-{profile}.properties配置文件
jar包外部的application.properties配置文件(此级别在测试环境经常使用。比如就在jar包同级目录放置一个配置文件,就内覆盖jar包内部所有的配置文件了)
jar包内部的application.properties配置文件
由jar包外向jar包内进行寻找,优先加载待profile的,再加载不带profile的。
@Configuration注解类上的@PropertySource(手动指定导入外部配置文件)
通过SpringApplication.setDefaultProperties指定的默认属性,自己程序代码里设置,优先级最低
加载了外部配置,还会记载内部配置吗?
我通过一个小实验来证明
//读取外部配置的key System.out.println(environment.getProperty("abcd")); //读取内部配置的key System.out.println(environment.getProperty("config.icon"));
内部配置:
config.icon=classpath:resource
外部配置:
abcd=abcd
结构如下图:
我用java -jar启动后,结果是:
内、外部配置的key对应的value都能输出
因此我们可以得出结论:不管内部、外部配置,形成的都是互补配置,都会加载