SpringBoot源码学习(二)
通过上篇文章的学习,大概清楚了springApplication类的功能。但是遗留了几个问题是读取application.properties和loader.load()的功能。因为这两个对于后边的分析会很重要。所以还是要深入的理解。
在学习的时候,发现在148行有对配置的处理。所以读取配置文件,并整合到spring中应该也就是在这里处理的。
我们进入这个方法。
private ConfigurableEnvironment prepareEnvironment(SpringApplicationRunListeners listeners, ApplicationArguments applicationArguments) {
ConfigurableEnvironment environment = this.getOrCreateEnvironment();
this.configureEnvironment((ConfigurableEnvironment)environment, applicationArguments.getSourceArgs());
//配置信息准备好的广播消息
listeners.environmentPrepared((ConfigurableEnvironment)environment);
//将配置绑定到springApplication上
this.bindToSpringApplication((ConfigurableEnvironment)environment);
if (!this.isCustomEnvironment) {
environment = (new EnvironmentConverter(this.getClassLoader())).convertEnvironmentIfNecessary((ConfigurableEnvironment)environment, this.deduceEnvironmentClass());
}
ConfigurationPropertySources.attach((Environment)environment);
return (ConfigurableEnvironment)environment;
}
显然这块最重要的方法就是environmentPrepared
那么我看一下里边具体的实现,这里有一个默认实现(第二个是咋自定义的),那么那么这个默认实现做了哪些事?
发现这里有个ConfigFileApplicationListener。这个看来就和配置读取有关系了。那么咋看看这个类做了哪些工作。
发现了大量的证据,这个configFileApplicationListener就是读取配置文件了。那么他是怎么做的?
通过debug,发现代理进入了这个listener中的onApplicationEvent方法。
这里通过读取spring.factories文件加载出来三个处理器。这三个处理器都和配置处理有关系。
而在每一个配置处理器中都postProcessEnvironment方法,比如在
ConfigFileApplicationListener就是通过loader.load方法读取配置的。
其中读取的配置的目录为
这些方法执行完毕,发现springBoot读取到了6个配置文件。其中application排最后。通过查阅相关的网络博客,提示说这6个配置文件是会依次被覆盖,就是如果前边的配置已经存在了那么后边的同名配置就不起作用了。就是说我们的application.properties是最被动的一个。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Linux 系统使用私钥登录的教程详解
- Ubuntu如何轻松编译openJDK详解
- 详解Linux下Tomcat开启查看GC信息
- Centos7.4 zabbix3.4.7源码安装的方法步骤
- CentOS7环境搭建python3以及与python2实现共存的方法
- centos7.0安装离线JDK1.8方法详解
- ubuntu中swap(虚拟内存)设置方法
- 详解Linux监控重要进程的实现方法
- CentOS环境下安装Redis3.0及phpredis扩展测试示例
- 使用Apache commons-cli包进行命令行参数解析的示例代码
- 详解如何在Ubuntu 16.04上增加Swap分区
- Mac本地文件上传到CentOS云服务器方法
- linux中把.c的文件编译成.so文件
- Ubuntu16.04 中 locate文件查找命令
- Ubuntu 16.04与Apache虚拟主机配置的步骤详解