Spring回调总结
其他
2020-04-20 11:19:48
阅读次数: 0
Create
- 获取SpringApplicationRunListener接口实现列表。读取META-INF/spring.factories中配置的实现,默认:EventPublishingRunListener。获取默认的监听器以及从工厂中获取ApplicationListener实现的bean并且支持当前类型的事件。回调监听器listener.onApplicationEvent。默认监听器如下图:
- 回调SpringApplicationRunListener.environmentPrepared方法。即通知监听器环境已准备完成
- 从应用上下文ConfigurableApplicationContext的类加载器中获取FailureAnalyzer类型并创建FailureAnalyzer。如果FailureAnalyzer实现类是BeanFactoryAware类型,则回调setBeanFactory
- 获取ApplicationContextInitializer接口实现列表。读取META-INF/spring.factories中配置的实现。回调初始化方法initializer.initialize
- 回调SpringApplicationRunListener.contextPrepared方法。即上下文准备完成通知
- 回调SpringApplicationRunListener.contextLoaded。
- 回调SpringApplicationRunListener.contextLoaded。上下文加载完成(仅加载source,通常为启动时指定的Application类)
- 在上下文的子类中允许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消息)
- 回调InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(如果返回bean非空,则说明初始化完成直接回调postAfter回调后返回当前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
- 上下文完成刷新时添加了JDK回调用的shutdown钩子关闭上下文
- 发布ContextClosedEvent关闭事件
- 回调lifecycleProcessor.onClose方法
- 回调DisposableBean.destroy方法
- 回调DisposableBeanAdapter.destroy方法。
- 回调DestructionAwareBeanPostProcessor.postProcessBeforeDestruction方法
- 如果不是DisposableBean类型则回调bean的销毁方法优先级:destroy配置的方法->close方法->shutdown方法->destroy方法
- 如果是web环境回调EmbeddedServletContainer.stop方法
发布了91 篇原创文章 ·
获赞 103 ·
访问量 3万+
转载自blog.csdn.net/u010597819/article/details/105188026