Spring Boot 属性配置的方式有以下几种,优先级分别从高到底排列
1、Devtool全局配置
2、测试环境@TestPropertySouce注解
3、测试环境properties属性
4、命令行参数
5、SPRING_APPLICATION_JSON属性
6、ServletConfig初始化参数
7、ServletContext初始化参数
8、JNDI属性
9、JAVA系统属性
10、操作系统环境变量
11、RandomValuePropertySource随机值属性
12、jar包外的application-{profile}.properties
13、jar包内的application-{profile}.properties
14、jar包外的application.properties
15、jar包内的application.properties
16、@PropertySource绑定配置
17、默认属性
下面分别从低优先级开始
17、默认属性
1)增加属性weburl的值为www.baidu.com
@SpringBootApplication
@MapperScan("com.example.demo.mapper")
public class Sb2Application {
public static void main(String[] args) {
SpringApplication springApplication = new SpringApplication(Sb2Application.class);
Properties properties = new Properties();
properties.setProperty("weburl","www.baidu.com");
springApplication.setDefaultProperties(properties);
springApplication.run(args);
}
}
2)然后通过一个启动类加载器打印属性weburl
@Component
public class ResultCommandLineRunner implements CommandLineRunner, EnvironmentAware {
private Environment env;
@Override
public void run(String... args) throws Exception {
System.out.println(env.getProperty("weburl"));
}
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
}
3)输出结果
. ____ _ __ _ _
/\\ / ___'_ __ _ _(_)_ __ __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
\\/ ___)| |_)| | | | | || (_| | ) ) ) )
' |____| .__|_| |_|_| |_\__, | / / / /
=========|_|==============|___/=/_/_/_/
:: Spring Boot :: (v2.1.6.RELEASE)
...
www.baidu.com
16、@PropertySource绑定配置
1)在前面的基础上,在resources文件夹下增加demo.properties文件
2) 然后使用PropertySource绑定配置
3) 运行程序
14、jar包外的application.properties
创建application.yml
输出结果
然后在application.properties增加配置
输出结果为
说明application.properties的优先级高于application.yml
13、jar包内的application-{profile}.properties
增加application-default.yml
输出结果
增加application-default.properties
输出结果
11、RandomValuePropertySource随机值属性
1)在application-default.properties中增加一个属性,值为随机数
2)在启动类加载器中输出这个属性
3) 运行结果
10、操作系统环境变量
设置环境变量
输出结果
9、JAVA系统属性
增加获取虚拟机名字
在启动类加载器中输出这个属性
输出结果
6、ServletConfig初始化参数 7、ServletContext初始化参数
6、7两种主要是通过server.xxx设置一些属性
5、SPRING_APPLICATION_JSON属性
增加参数--SPRING_APPLICATION_JSON={\"weburl\":\"hello,SPRING_APPLICATION_JSON\"}
输出结果:
4、命令行参数
增加参数
输出结果
2、测试环境@TestPropertySouce注解 3、测试环境properties属性
这两个测试用的比较多
Spring Aware原理
一、Aware介绍
Spring框架有点: Bean感知不到容器的存在
使用场景: 需要使用Spirng容器的功能资源
引入缺点: Bean和容器强耦合
二、常用Aware
类名 | 作用 |
BeanNameAware | 获取容器中bean名称 |
BeanClassLoaderAware | 获得类加载器 |
BeanFactoryAware | 获得bean创建工厂 |
EnviromentAware | 获得环境变量 |
EnvironmentValueResolverAware | 获取spring容器加载的properties文件属性值 |
ResourceLoaderAware | 获得资源加载器 |
ApplicationEventPublisherAware | 获得应用程序发布器 |
MessageSourceAware | 获得文本信息 |
ApplicationContextAware | 获得当前应用上下文
|
三、Aware调用原理
我们以ResultCommandLineRunner启动类加载器为例。实现了EnvironmentAware接口,目的就是为了获得environment,从而打印属性
@Component
public class ResultCommandLineRunner implements CommandLineRunner, EnvironmentAware , MyAware{
private Environment env;
private Flag flag;
@Override
public void run(String... args) throws Exception {
System.out.println(flag.isCanOperate());
System.out.println(env.getProperty("weburl"));
System.out.println(env.getProperty("weburl.random"));
System.out.println(env.getProperty("weburl.vm.name"));
}
@Override
public void setEnvironment(Environment environment) {
this.env = environment;
}
@Override
public void setFlag(Flag flag) {
this.flag = flag;
}
}
1、Debug运行程序,定位到initializeBean方法
2、进入initializeBean。beanName为resultCommandLineRunner(可以根据beanName设置条件断点)
下面是initializeBean的方法
3、进入postProcessBeforeInitialization方法
4、进入ApplicationContextAwareProcessor类的invokeAwareInterfaces方法
5、然后就进入了setEnvironment方法,参数为environment。
这就是通过启动类加载器,实现EnvironmentAware,从而获得Environment的流程
四、模拟创建自定义Aware
1、创建Flag类
1 2 3 4 5 6 7 8 9 10 11 12 13 |
|
2、创建自定义Aware接口,目的就是为了获得Flag。继承Aware接口
1 2 3 4 |
|
3、创建处理器
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
|
4、启动类加载器增加flag变量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
5、运行。输出flag为true
Spring Aware原理
https://www.cnblogs.com/linlf03/p/12384829.html
SpringBoot Environment使用
https://www.cnblogs.com/linlf03/p/12386371.html
SpringBoot Profile源码介绍
https://www.cnblogs.com/linlf03/p/12389396.html