SpringApplication.run方法逻辑:
1、创建ApplicationArguments对象
applicationArguments -> new DefaultApplicationArguments(args)
|- source -> new DefaultApplicationArguments$Source(args)
"commandLineArgs" commandLineArgs
source的类图如下:
Source
SimpleCommandLinePropertySource
CommandLinePropertySource
EnumerablePropertySource
PropertySource
|- name "commandLineArgs"
|- T commandLineArgs
2、创建environment对象,顺便创建下面的propertySources对象
ConfigurableEnvironment environment -> new ApplicationServletEnvironment
|- propertyResolver ConfigurationPropertySourcesPropertyResolver
|- propertySources MutablePropertySources
[StubPropertySource {name='servletConfigInitParams'},
StubPropertySource {name='servletContextInitParams'},
PropertiesPropertySource {name='systemProperties'},
SystemEnvironmentPropertySource {name='systemEnvironment'}]
new SimpleCommandLinePropertySource(args)
3、创建ApplicationContext对象
context -> AnnotationConfigServletWebServerApplicationContext
context.addBeanFactoryPostProcessor(new PropertySourceOrderingBeanFactoryPostProcessor(context));
4、调用刷新方法回到以前spring的流程
refreshContext -> refresh(context); -> applicationContext.refresh();回到以前的spring正常流程,之后jayspt的beanfactory后置处理器被调用,把environment.propertySources里所有PropertySource都给包装一下重新赋值到environment里。
总结:
1、springboot比spring多了上面步骤1,2步骤。
2、springboot里给bean设置字符串属性时读取值遍历上面多个propertySources对象,每个对象当成map就行,有的对象对应application.yml,有的对应启动脚本里的入参参数集合,有的对应当前系统的环境遍历,有的对应webcontext(我估计类似以前web.xml)里的key,value集合。
标签:name,流程,commandLineArgs,environment,tmpspringboot,context,propertySources,new
From: https://www.cnblogs.com/bplan/p/18427260