上篇文章源码进行到如下位置
命令行参数解析
跟进DefaultApplicationArguments,不断追踪,会发现它是用来解析命令行参数的
最终parse方法会返回命令行参数commandLineArgs
环境配置
prepareEnvironment
进入prepareEnvironment方法继续追溯到getOrCreateEnvironment方法
可以看到这里根据webApplicationType决定采用哪种标准环境,这里采用的是Servlet环境
继续看下Servlet标准环境下的内容
在这个类中定义了servlet的两个最重要的属性值:servletContextInitParams 和 servletConfigInitParams
此外还有JNDI的属性值jndiProperties
customizePropertySources方法将上述三个属性值存储到了MutablePropertySources里
attach()
在这里完成了configurationProperties的初始化
模版方法configureEnvironment
将ConversionService设置到环境里,具体设置在了propertyResolver里
configurePropertySources主要是对命令行参数的配置
把activeProfiles环境信息加入到environment中
可以看到,这里就是为什么yaml配置文件中配置的上线环境要写active
attach方法将ConfigurationPropertySources加入environment,这一步不重要
environmentPrepared方法
跟踪进去后,发现了和starting一模一样的方法,只不过方法名替换为了EnvironmentPrepared
里边流程也一模一样,最终匹配到11个ApplicationListeners中剩下的7个ApplicationListeners(listeners匹配events)
这里只重点关注7个ApplicationListeners的内容
第一个:ConfigFileApplicationListener
遍历7个ApplicationListeners的第一个,持续跟踪会看到下面代码
依旧从spring.factories文件中以EnvironmentPostProcessor.class为key,反射获取类的实例
这里一个获取到了4个,如下
遍历以上四个PostProcessor
第一个:SystemEnvironmentPropertySourceEnvironmentPostProcessor
可以看到主要作用:对象转换 (ps: 至于为什么要进行对象转换,个人水平不足,没有猜到,如果有哪位大牛知道,还请留言,感谢!)
第二个:SpringApplicationJsonEnvironmentPostProcessor
主要作用:对Json配置的设置
第三个:CloudFoundryVcapEnvironmentPostProcessor —> 里边啥都没干
第四个:ConfigFileApplicationListener —> 源码如下
对yaml/properties配置文件中随机值设置规范,这里明确要求前缀为“random.”
加载yaml/properties配置资源,这里又看到了LoadFactories方法,因此还是一样,从spring.factories配置文件中获取PropertySourceLoader为key的value值,获取类的实例
可以看到,yaml / properties资源已经加载完毕
该方法执行结束后,我们所写的yaml / properties 配置文件就加载结束了。