Spring初始化流程
Spring IOC初始化流程
首先通过new ApplicationContext()
触发IOC容器初始化,ApplicationContext的refresh方法里完成容器初始化。具体过程:
- 定位。通过Resource定位BeanDefinition,BeanDefinition抽象了对bean的定义,比如bean的信息,依赖关系等。
- FileSystemXmlApplicationContext里调用refresh()方法初始化IoC容器。
- 在refresh()方法里调用obtainFreshBeanFactory()里面的refreshBeanFactory()来完成BeanDefinition的定位。
- refreshBeanFactory()中是通过loadBeanDefinitions()来完成BeanDefinition的定位,具体由AbstractBeanDefinitionReader里的loadBeanDefinitions()来实现。
- 载入。根据BeanDefinition在Ioc容器中创建(实例化)bean。
- 执行BeanPostProcessors进行后置处理
- 注册。把bean放入IOC容器中,底层是个Map。
- 事件。注册事件监听器 registerListeners,finishRefresh后发布事件
SpringBoot初始化流程
@SpringBootApplication
标注的启动类开始
- springboot启动应用程序之前,会创建一些初始化对象(如
ApplicationContextInitializer
)和监听器。通过loadSpringFactories()
读取自动配置,创建好初始化对象后,listeners.starting();
启动监听器 - 创建上下文。
createApplicationContext()
、创建工厂对象 - 刷新上下文。
refreshContext()
、配置工厂对象和bean。此时通过BeanPostProcessors实现AOP逻辑注入,得到代理对象,注册到IOC容器。 - 发布通知:通知上下文刷新完成。上下文初始化完成之后,
startWebServer()
启动tomcat服务器,程序启动完成。