tmpspringboot流程

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集合。
posted @ 2024-09-23 16:34  bplan2010  阅读(17)  评论(0)    收藏  举报