You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

2.7 KiB

Spring启动流程

prepareRefresh()

记录时间、active标记、获取environment(系统环境变量和System.setProperty()设置的)、初始化监听器和事件集合。

obtainFreshBeanFactory()

关闭以前的BeanFactory创建一个新的BeanFactory供上下文生命周期的各阶段使用。 父beanDefinition、bean可覆盖、循环引用 loadBeanDefinitions()通过inputStream读取并解析xml文档拿到beanDefinition。

prepareBeanFactory()

准备BeanFactory设置ClassLoader、SPEL解析器、propertyEditor、BeanPostProcessor(ApplicationContextAwareProcessor)、ignoreDependencyInterface(各种Aware接口)、registerResolvableDependency、BeanPostProcessor(ApplicationListenerDetector、environment单例。

postProcessBeanFactory(beanFactory)

继承ClassPathXmlApplicationContext的子类可以修改beanFactory用于实现一些自定义的功能。

invokeBeanFactoryPostProcessors(beanFactory)

BeanDefinitionRegistryPostProcessors和BeanFactoryPostProcessors按照实现PriorityOrdered、Ordered接口、没有实现这两个接口的PostProcessors处理执行顺序@Order注解在这里是不考虑的。

// Register bean processors that intercept bean creation.

registerBeanPostProcessors(beanFactory)

BeanPostProcessor按照实现PriorityOrdered、Ordered接口、没有实现这两个接口的PostProcessors处理执行顺序@Order注解在这里是不考虑的。 BeanPostProcessorChecker用来记录日志。

initMessageSource()

初始化MessageSourceMessageSource是格式化字符串的?

initApplicationEventMulticaster()

初始化应用事件监听器SimpleApplicationEventMulticaster通过线程池往各种监听器添加事件。

onRefresh()

由子类实现比如Spring Boot创建web server。

registerListeners()

注册所有实现了ApplicationListener接口的监听器并发布早起应用事件。

finishBeanFactoryInitialization(beanFactory)

实例化所有非懒加载的单例。 ConversionService(转换系统的一个入口,可用于常见的日期格式转换?)、添加EmbeddedValueResolver、BeanFactory方式获取LoadTimeWeaverAware、置空temporary ClassLoader、冻结配置、预实例化单例。 preInstantiateSingletons() 遍历beanNames触发所有非懒加载bean实例化。 遍历beanNames触发所有适用 bean 的初始化后回调。 getBean(beanName) -> doGetBean -> getSingleton(三级缓存) -> createBean -> doCreateBean -> 代理和反射创建bean(三级缓存) -> populateBean -> initializeBean

finishRefresh()

清理资源缓存、初始化LifecycleProcessor、发布最终事件

resetCommonCaches()

contextRefresh.end()