欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

实际上加载@Configu 劳务派遣信息管理系统 ration的工作是在这里做的

点击: 次  来源:劳务派遣管理系统 时间:2017-12-03

原文出处: Daniel Qian

相关代码在: https://github.com/chanjarster/spring-boot-all-callbacks

注:本文基于spring-boot 1.4.1.RELEASE, spring 4.3.3.RELEASE撰写。

启动顺序

Spring boot的启动代码一般是这样的:

@SpringBootApplication
public class SampleApplication {
  public static void main(String[] args) throws Exception {
    SpringApplication.run(SampleApplication.class, args);
  }
}

初始化SpringApplication

  1. SpringApplication#run(Object source, String... args)#L1174
  2. SpringApplication#L1186 -> SpringApplication(sources)#L236
  3. SpringApplication#initialize(Object[] sources)#L256 javadoc
  4. SpringApplication#L257 添加source(复数),SpringApplication利用source来构建Bean。一般来说在run的时候城市把@SpringBootApplication标志的类(本例中是SampleApplication)放到sources参数里,然后由这个类出发找到Bean的界说。
  5. SpringApplication#L261 初始化ApplicationContextInitializer列表(见附录)
  6. SpringApplication#L263 初始化ApplicationListener列表(见附录)
  7. SpringApplication#L1186 -> SpringApplication#run(args)#L297,进入运行阶段

推送ApplicationStartedEvent

SpringApplication#run(args)#L297

  1. SpringApplication#L303 初始化SpringApplicationRunListeners (SpringApplicationRunListener的荟萃)。它内部只包括EventPublishingRunListener。
  2. SpringApplication#L304 推送ApplicationStartedEvent给所有的ApplicationListener(见附录)。 下面是体贴此事件的listener:
    1. LiquibaseServiceLocatorApplicationListener
    2. LoggingApplicationListener(见附录)

筹备Environment

SpringApplication#run(args)#L297->#L308->prepareEnvironment(...)#L331筹备ConfigurableEnvironment。

  1. SpringApplication#L335 建设StandardEnvironment(见附录)。
  2. SpringApplication#L336 设置StandardEnvironment,将呼吁行和默认参数整吧整吧,添加到MutablePropertySources。
  3. SpringApplication#L337 推送ApplicationEnvironmentPreparedEvent给所有的ApplicationListener(见附录)。下面是体贴此事件的listener:
  4. BackgroundPreinitializer
  5. FileEncodingApplicationListener
  6. AnsiOutputApplicationListener
  7. ConfigFileApplicationListener(见附录)
  8. DelegatingApplicationListener
  9. ClasspathLoggingApplicationListener
  10. LoggingApplicationListener
  11. ApplicationPidFileWriter

可以参考官方文档相识StandardEnvironment构建好之后,其MutablePropertySources内部到底有些啥东东。

建设及筹备ApplicationContext

SpringApplication#run(args)#L297

  1. SpringApplication#L311->SpringApplication#createApplicationContext()#L583建设ApplicationContext。可以看到实际上建设的是AnnotationConfigApplicationContext或AnnotationConfigEmbeddedWebApplicationContext。
  2. 在结构AnnotationConfigApplicationContext的时候,间接注册了一个BeanDefinitionRegistryPostProcessor的Bean:ConfigurationClassPostProcessor。经过AnnotatedBeanDefinitionReader结构函数->AnnotationConfigUtils.registerAnnotationConfigProcessors。
  3. SpringApplication#L313->SpringApplication#prepareContext(...)#L344筹备ApplicationContext
  4. SpringApplication#L347->context.setEnvironment(environment),把之前筹备好的Environment塞给ApplicationContext
  5. SpringApplication#L348->postProcessApplicationContext(context)#L605,给ApplicationContext配置了一些其他对象
  6. SpringApplication#L349->applyInitializers(context)#L630,挪用之前筹备好的ApplicationContextInitializer
  7. SpringApplication#L350->listeners.contextPrepared(context)->EventPublishingRunListener.contextPrepared,但实际上啥都没做。
  8. SpringApplication#L366->load#L687,认真将source(复数)里所界说的Bean加载到ApplicationContext里,在本例中就是SampleApplication,这些source是在初始化SpringApplication阶段得到的。
  9. SpringApplication#L367->listeners.contextLoaded(context)->EventPublishingRunListener.contextLoaded。
  10. 将SpringApplication本身拥有的ApplicationListener插手到ApplicationContext
  11. 发送ApplicationPreparedEvent。今朝已知体贴这个事件的有ConfigFileApplicationListener、LoggingApplicationListener、ApplicationPidFileWriter

要留意的是在这个阶段,ApplicationContext里只有SampleApplication,SampleApplication是Bean的加载事情的起点。

刷新ApplicationContext

按照前面所讲,这里的ApplicationContext实际上是GenericApplicationContext ->AnnotationConfigApplicationContext可能AnnotationConfigEmbeddedWebApplicationContext