一:什么是IoC
IoC:Inversion of Control,控制反转的意思,获得依赖对象的过程由自身管理变为了由IOC容器主动注入,由容器来管理对象的生命周期。
二:时序图
三:浅析
ioc可以大致分为定位,加载,注册三个阶段。
1.定位阶段:
首先是定位阶段,源码的入口在ClassPathXmlApplicationContext的构造函数,在构造函数中调用setConfigLocations()解析Bean定义资源文件的路径,处理多个资源文件字符串数组。然后再调用refresh(),refresh()方法中通过obtainFreshBeanFactory()获取ConfigurableListableBeanFactory,obtainFreshBeanFactory()方法中调用refreshBeanFactory()方法,refreshBeanFactory()方法中调用createBeanFactory()方法创建IOC容器并且调用loadBeanDefinitions(beanFactory)方法,进入到加载阶段。
2.加载阶段
loadBeanDefinitions(DefaultListableBeanFactory beanFactory)方法中会创建一个beanDefinitionReader然后调用loadBeanDefinitions(beanDefinitionReader)方法,在loadBeanDefinitions(XmlBeanDefinitionReader reader)方法中会调用loadBeanDefinitions(Resource… resources)方法,接下来会调用loadBeanDefinitions(Resource resource)然后是loadBeanDefinitions(new EncodedResource(resource)),在loadBeanDefinitions(new EncodedResource(resource))方法中调用doLoadBeanDefinitions(inputSource, encodedResource.getResource()),
doLoadBeanDefinitions(InputSource inputSource, Resource resource)方法中调用registerBeanDefinitions(Document doc, Resource resource)方法,进入到注册阶段。
3.注册阶段
调用registerBeanDefinitions(Document doc, XmlReaderContext readerContext),接下来调用doRegisterBeanDefinitions(root),doRegisterBeanDefinitions方法中创建一个委派者,调用parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate),接下来调用parseDefaultElement(ele, delegate)方法对bean元素进行解析,然后调用processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate),processBeanDefinition方法中调用BeanDefinitionReaderUtils工具类的registerBeanDefinition(
BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry)方法,最后调用registerBeanDefinition(String beanName, BeanDefinition beanDefinition)方法将beanDefinition放入beanDefinitionMap中。