Spring回调总结

Create

  1. 获取SpringApplicationRunListener接口实现列表。读取META-INF/spring.factories中配置的实现,默认:EventPublishingRunListener。获取默认的监听器以及从工厂中获取ApplicationListener实现的bean并且支持当前类型的事件。回调监听器listener.onApplicationEvent。默认监听器如下图:在这里插入图片描述
  2. 回调SpringApplicationRunListener.environmentPrepared方法。即通知监听器环境已准备完成。例如:ConfigFileApplicationListener监听器接收事件后回调onApplicationEnvironmentPreparedEvent。然后回调EnvironmentPostProcessor.postProcessEnvironment
  3. 从应用上下文ConfigurableApplicationContext的类加载器中获取FailureAnalyzer类型并创建FailureAnalyzer。如果FailureAnalyzer实现类是BeanFactoryAware类型,则回调setBeanFactory
  4. 准备上下文开始:org.springframework.boot.SpringApplication#prepareContext
  5. 获取ApplicationContextInitializer接口实现列表。读取META-INF/spring.factories中配置的实现。回调初始化方法initializer.initialize
  6. 回调SpringApplicationRunListener.contextPrepared方法。即上下文准备完成通知
  7. 回调SpringApplicationRunListener.contextLoaded。
  8. 回调SpringApplicationRunListener.contextLoaded。上下文加载完成(仅加载source,通常为启动时指定的Application类)
  9. 准备上下文完成:org.springframework.boot.SpringApplication#prepareContext
  10. 在上下文的子类中允许beanFactory的后置处理(会注册一些默认的后置处理bean)
  11. 回调上下文中(add方法添加)的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry
  12. 回调工厂中的BeanDefinitionRegistryPostProcessor.postProcessBeanDefinitionRegistry(按照排序优先级逐个调用,先回调实现了PriorityOrdered接口的BeanDefinitionRegistryPostProcessor再处理实现了Ordered接口的BeanDefinitionRegistryPostProcessor,最后回调剩余的)。回调剩余BeanFactoryPostProcessor.postProcessBeanFactory方法(同时实现了BeanDefinitionRegistryPostProcessor、BeanFactoryPostProcessor两个接口的bean)
  13. 回调工厂中的BeanFactoryPostProcessor.postProcessBeanFactory方法(优先级:PriorityOrdered->Ordered->other)
  14. 注册LoadTimeWeaverAwareProcessor后置处理至工厂
  15. 根据工厂中bean定义,获取所有BeanPostProcessor类型定义的名称,注册拦截bean创建的后置处理器BeanPostProcessor至工厂(包含非单例)
  16. 注册ApplicationListener监听器(包含非单例)至ApplicationEventMulticaster。回调ApplicationListener.onApplicationEvent(如果存在earlyApplicationEvents消息)
  17. 创建bean前AbstractAutowireCapableBeanFactory.createBean->AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation回调InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(如果返回bean非空,则说明初始化完成直接回调postProcessAfterInitialization回调后返回当前bean)
  18. 回调BeanPostProcessor.postProcessAfterInitialization方法。如果上一步返回为空则继续。
  19. 回调SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors
  20. 回调MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition。此时bean(instanceWrapper)刚刚创建完成
  21. 回调SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference方法。此时bean还未完成初始化。
  22. 回调InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation方法
  23. 回调InstantiationAwareBeanPostProcessor.postProcessPropertyValues方法,注入属性前回调
  24. 如果bean是BeanNameAware类型回调BeanNameAware.setBeanName
  25. 如果bean是BeanClassLoaderAware类型回调BeanClassLoaderAware.setBeanClassLoader
  26. 如果bean是BeanFactoryAware类型回调BeanFactoryAware.setBeanFactory
  27. 回调BeanPostProcessor.postProcessBeforeInitialization方法。调用bean的初始化方法前回调。回调PostConstruct注解的方法
  28. 如果bean是InitializingBean类型,回调InitializingBean.afterPropertiesSet。此时是在调用用户的自定义init方法前
  29. 回调BeanPostProcessor.postProcessAfterInitialization方法
  30. 回调Lifecycle.start方法。LifecycleProcessor接口bean从工厂获取LifecycleProcessor类型,名称为lifecycleProcessor的bean
  31. 广播ContextRefreshedEvent事件
  32. 完成上下文刷新后为上下文注册钩子registerShutdownHook。AbstractApplicationContext.registerShutdownHook方法。
  33. 完成上下文刷新后回调ApplicationRunner、CommandLineRunner.run方法
  34. 回调SpringApplicationRunListener.finished方法

Destroy

  1. doCreateBean完成时registerDisposableBeanIfNecessary方法中回调DestructionAwareBeanPostProcessor.requiresDestruction方法判断是否需要注册销毁bean的适配bean:将bean、BeanPostProcessors封装为DisposableBeanAdapter,如果bean存在:hasDestroyMethod、hasDestructionAwareBeanPostProcessors、hasApplicableProcessors,则以beanName为key注册至disposableBeans,否则注册至Scope回调registerDestructionCallback,等待回调适配bean的run方法(适配器bean为Runnable实现类)
  2. 上下文完成刷新时添加了JDK回调用的shutdown钩子关闭上下文:org.springframework.boot.SpringApplication#refreshContext,代码见下方。如果刷新上下文失败(前提是BeansException异常类型,源码见:org.springframework.context.support.AbstractApplicationContext#refresh)也会销毁bean:org.springframework.context.support.AbstractApplicationContext#destroyBeans
  3. 发布ContextClosedEvent关闭事件
  4. 回调lifecycleProcessor.onClose方法
  5. 回调DisposableBean.destroy方法
  6. 回调DisposableBeanAdapter.destroy方法。
  7. 回调DestructionAwareBeanPostProcessor.postProcessBeforeDestruction方法
  8. 如果不是DisposableBean类型则回调bean的销毁方法优先级:destroy配置的方法->close方法->shutdown方法->destroy方法
  9. 如果是web环境回调EmbeddedServletContainer.stop方法
private void refreshContext(ConfigurableApplicationContext context) {
	refresh(context);
	if (this.registerShutdownHook) {
		try {
			context.registerShutdownHook();
		}
		catch (AccessControlException ex) {
			// Not allowed in some environments.
		}
	}
}
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值