Create
获取SpringApplicationRunListener接口实现列表。读取META-INF/spring.factories中配置的实现,默认:EventPublishingRunListener。获取默认的监听器以及从工厂中获取ApplicationListener实现的bean并且支持当前类型的事件。回调监听器listener.onApplicationEvent。默认监听器如下图: 回调SpringApplicationRunListener.environmentPrepared方法。即通知监听器环境已准备完成。例如:ConfigFileApplicationListener监听器接收事件后回调onApplicationEnvironmentPreparedEvent。然后回调EnvironmentPostProcessor.postProcessEnvironment 从应用上下文ConfigurableApplicationContext的类加载器中获取FailureAnalyzer类型并创建FailureAnalyzer。如果FailureAnalyzer实现类是BeanFactoryAware类型,则回调setBeanFactory 准备上下文开始:org.springframework.boot.SpringApplication#prepareContext 获取ApplicationContextInitializer接口实现列表。读取META-INF/spring.factories中配置的实现。回调初始化方法initializer.initialize 回调SpringApplicationRunListener.contextPrepared方法。即上下文准备完成通知 回调SpringApplicationRunListener.contextLoaded。 回调SpringApplicationRunListener.contextLoaded。上下文加载完成(仅加载source,通常为启动时指定的Application类) 准备上下文完成:org.springframework.boot.SpringApplication#prepareContext 在上下文的子类中允许beanFactory的后置处理(会注册一些默认的后置处理bean) 回调上下文中(add方法添加)的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry 回调工厂中的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(按照排序优先级逐个调用,先回调实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor再处理实现了Ordered接口的BeanDefinitionRegistryPostProcessor,最后回调剩余的)。回调剩余BeanFactoryPostProcessor.postProcessBeanFactory方法(同时实现了BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor两个接口的bean) 回调工厂中的BeanFactoryPostProcessor.postProcessBeanFactory方法(优先级:PriorityOrdered->Ordered->other) 注册LoadTimeWeaverAwareProcessor后置处理至工厂 根据工厂中bean定义,获取所有BeanPostProcessor类型定义的名称,注册拦截bean创建的后置处理器BeanPostProcessor至工厂(包含非单例) 注册ApplicationListener监听器(包含非单例)至ApplicationEventMulticaster。回调ApplicationListener.onApplicationEvent(如果存在earlyApplicationEvents消息) 创建bean前AbstractAutowireCapableBeanFactory.createBean->AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation回调InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(如果返回bean非空,则说明初始化完成直接回调postProcessAfterInitialization回调后返回当前bean) 回调BeanPostProcessor.postProcessAfterInitialization方法。如果上一步返回为空则继续。 回调SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors 回调MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。此时bean(instanceWrapper)刚刚创建完成 回调SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法。此时bean还未完成初始化。 回调InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法 回调InstantiationAwareBeanPostProcessor.postProcessPropertyValues方法,注入属性前回调 如果bean是BeanNameAware类型回调BeanNameAware.setBeanName 如果bean是BeanClassLoaderAware类型回调BeanClassLoaderAware.setBeanClassLoader 如果bean是BeanFactoryAware类型回调BeanFactoryAware.setBeanFactory 回调BeanPostProcessor.postProcessBeforeInitialization方法。调用bean的初始化方法前回调。回调PostConstruct注解的方法 如果bean是InitializingBean类型,回调InitializingBean.afterPropertiesSet。此时是在调用用户的自定义init方法前 回调BeanPostProcessor.postProcessAfterInitialization方法 回调Lifecycle.start方法。LifecycleProcessor接口bean从工厂获取LifecycleProcessor类型,名称为lifecycleProcessor的bean 广播ContextRefreshedEvent事件 完成上下文刷新后为上下文注册钩子registerShutdownHook。AbstractApplicationContext.registerShutdownHook方法。 完成上下文刷新后回调ApplicationRunner、CommandLineRunner.run方法 回调SpringApplicationRunListener.finished方法
Destroy
doCreateBean完成时registerDisposableBeanIfNecessary方法中回调DestructionAwareBeanPostProcessor.requiresDestruction方法判断是否需要注册销毁bean的适配bean:将bean、BeanPostProcessors封装为DisposableBeanAdapter,如果bean存在:hasDestroyMethod、hasDestructionAwareBeanPostProcessors、hasApplicableProcessors,则以beanName为key注册至disposableBeans,否则注册至Scope回调registerDestructionCallback,等待回调适配bean的run方法(适配器bean为Runnable实现类) 上下文完成刷新时添加了JDK回调用的shutdown钩子关闭上下文:org.springframework.boot.SpringApplication#refreshContext,代码见下方。如果刷新上下文失败(前提是BeansException异常类型,源码见:org.springframework.context.support.AbstractApplicationContext#refresh)也会销毁bean:org.springframework.context.support.AbstractApplicationContext#destroyBeans 发布ContextClosedEvent关闭事件 回调lifecycleProcessor.onClose方法 回调DisposableBean.destroy方法 回调DisposableBeanAdapter.destroy方法。 回调DestructionAwareBeanPostProcessor.postProcessBeforeDestruction方法 如果不是DisposableBean类型则回调bean的销毁方法优先级:destroy配置的方法->close方法->shutdown方法->destroy方法 如果是web环境回调EmbeddedServletContainer.stop方法
private void refreshContext ( ConfigurableApplicationContext context) {
refresh ( context) ;
if ( this . registerShutdownHook) {
try {
context. registerShutdownHook ( ) ;
}
catch ( AccessControlException ex) {
}
}
}