SpringBoot源码学习(二)

时间:2022-07-24
本文章向大家介绍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是最被动的一个。