spring容器初始化过程

一、组件:

beanDefinitionMap要创建的类名和类描述集合,beanDefinitionNames要创建的类名集合。

二、整体描述:

启动一个WEB项目的时候, WEB容器会去读取它的配置文件web.xml,web.xml中有一个监听器读取web.xml中配置的xml文件解析xml文件中的组件放入到beanDefinitionMap和beanDefinitionNames中,然后变量beanDefinitionNames去创建类。

三、解析xml流程

ContextLoaderListener,实现了web容器接口ServletContextListener,ServletContextListener监听到web容器启动时,加载本类的contextInitialized方法。
在这里插入图片描述
当ContextLoader初始化时,执行静态方法获取ContextLoader.properties配置文件,赋值给全局变量defaultStrategies。
在这里插入图片描述
ContextLoader.properties内容如下。
在这里插入图片描述
看ContextLoaderListener继承关系
父类ContextLoader
ContextLoaderListener实现了contextInitializedinit执行父类initWebApplicationContext
->this.context = createWebApplicationContext(servletContext);
->determineContextClass读取defaultStrategies中key值为org.springframework.web.context.WebApplicationContext的值
org.springframework.web.context.support.XmlWebApplicationContext最后创建出来XmlWebApplicationContex对象后返回。
在这里插入图片描述
查看XmlWebApplicationContext继承关系
父类AbstractRefreshableWebApplicationContext
父类AbstractRefreshableConfigApplicationContext
父类AbstractRefreshableApplicationContext
父类AbstractApplicationContext
实现ConfigurableWebApplicationContext
父类WebApplicationContext
如图进入if判断中,强转XmlWebApplicationContext对象为ConfigurableWebApplicationContext类型。继续执行
configureAndRefreshWebApplicationContext在这里插入图片描述

读取web.xml中key为contextConfigLocation的值放入到spring容器中。
在这里插入图片描述
在这里插入图片描述
继续执行wac.refresh();wac就是传入的XmlWebApplicationContext对象。执行AbstractApplicationContext(XmlWebApplicationContext的父类)中refresh。
在这里插入图片描述
执行obtainFreshBeanFactory
->refreshBeanFactory(AbstractRefreshableApplicationContext中,XmlWebApplicationContext的父类)
->loadBeanDefinitions(XmlWebApplicationContext)
循环遍历web.xml中配置的xml文件路径。

执行loadBeanDefinitions(AbstractBeanDefinitionReader)
在这里插入图片描述
其中 getConfigLocations();
在这里插入图片描述一旦configLocations为null时会调用getDefaultConfigLocations在这里插入图片描述默认加载/WEB-INF/applicationContext.xml文件,所以说在web.xml中没有配置contextConfigLocation中value默认加载/WEB-INF/applicationContext.xml。在这里插入图片描述在这里插入图片描述
执行到loadBeanDefinitions(XmlWebApplicationContext)
读取xml后把xml中bean注册到BeanDefinition(类的描述类)中
在这里插入图片描述
执行在这里插入图片描述
执行DefaultBeanDefinitionDocumentReader中processBeanDefinition在这里插入图片描述
执行在这里插入图片描述
执行BeanDefinitionReaderUtils中registerBeanDefinition在这里插入图片描述
每注册一个组件beanDefinitionNames(List)添加组件名称,beanDefinitionMap(Map)放入组件名key,和组件描述value。这两个会在创建组件的时候使用。
在这里插入图片描述

四、创建bean的流程

继续执行AbstractApplicationContext中refresh中finishBeanFactoryInitialization方法进行bean创建。
->beanFactory.preInstantiateSingletons();
遍历beanDefinitionNames中的bean
在这里插入图片描述
obtainFreshBeanFactory返回的bean类型为DefaultListableBeanFactory
继承关系AbstractAutowireCapableBeanFactory
父类AbstractAutowireCapableBeanFactory
父类AbstractBeanFactory

->getBean(DefaultListableBeanFactory)
->doGetBean(DefaultListableBeanFactory)
->createBean(AbstractBeanFactory)
在这里插入图片描述
首先看一下怎么获取的RootBeanDefinition对象
进入getMergedLocalBeanDefinition调用了getBeanDefinition
在这里插入图片描述
从beanDefinitionMap中取出。解析xml流程中放入的beanDefinitionMap。
在这里插入图片描述

->createBean(AbstractAutowireCapableBeanFactory)
在这里插入图片描述
先看一下创建bean之前执行了实现InstantiationAwareBeanPostProcessor接口的类,遍历执行postProcessBeforeInstantiation,所以实现了InstantiationAwareBeanPostProcessor接口的类会在类创建之前执行postProcessBeforeInstantiation。
在这里插入图片描述
继续看 doCreateBean(beanName, mbd, args);
->createBeanInstance(String beanName, RootBeanDefinition mbd, Object[] args)
->instantiateBean(beanName, mbd)
->getInstantiationStrategy().instantiate(mbd, beanName, parent);
从BeanDefinition中取出BeanClass利用反射创建对象。
在这里插入图片描述
bean创建完成后执行populateBean(beanName, mbd, instanceWrapper);
initializeBean(beanName, exposedObject, mbd);这两个方法的解析我的博客【spring BeanPostProcessor使用场景】

https://blog.csdn.net/qq_21190847/article/details/105467504

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值