Spring IOC运行时序图
2019-04-18 10:35:53 5 举报
SpringIOC
作者其他创作
大纲/内容
AbstractApplicationContext
loadBeanDefinitions(beanFactory)
createBeanFactory()
调用容器预处理方法,获取时间,设置同步标识
refresh()
postProcessXml(root)
obtainFreshBeanFactory()
配置具体加载配置的资源加载器
从特定的配置文件中实际载入Bean配置资源
setConfigLocations( String... locations)
AbstractXmlApplicationContext
设置Bean配置信息的定位路径
super()
如果BeanFactory存在则先销毁并关闭。
refresh()是一个模板方法,规定了IOC容器的启动流程,部分逻辑交给子类去实现
loadBeanDefinitions(resource)
委派模式,具体载入交给子类
customizeBeanFactory(beanFactory)
IOC容器定制化,如设置启动参数,开启注解的自动装配等
refresh()方法的主要作用是:在创建IOC容器前,如果已经有容器存在,则需要把已有的容器销毁和关闭,以保证在refresh之后使用的是新建立起来的IOC容器。它类似于对IOC容器的重启,在新建立好的容器中对容器进行初始化,对Bean配置资源进行载入。
BeanDefinitionParserDelegate
loadBeanDefinitions(beanDefinitionReader)
此处为真正的加载,Bean读取器加载Bean定义资源
BeanFactory 的主要方法:1:Object getBean(...); 2:boolean containsBean(...); 3:boolean isSingleton(...); 4:boolean isPrototype(...);5:Boolean isTypeMatch(...); 6:Class<?> getType(...); 7:String[] getAliases(....);典型的抽象工厂,只定义产品的基本行为,具体的实现交给子类去实现;
Bean定义资源文件的载入从子类方法启动
ClassPathXmlApplicationContext
Bean的解析过程非常复杂,功能被分的很细,比如我们配置基础Spring的Spring.xml; 配置MVC的Spring-mvc.xml; 配置AOP的Spring-aop.xml; ....
调用 ClassPathXmlApplicationContext 的 init() 方法
启动IOC容器对Bean定义的解析过程
registerBeanDefinition
parseBeanDefinitionElement(ele)
给容器设置好Bean资源加载器ResourcePatternResolver
注册
BeanFactory:Spring中的对象称为Bean,Spring中有各种各样的Bean,每种Bean都有各自的特征,每种类型的Bean都要交给对应的工厂去创建,所有工厂抽象出来的顶级工厂即为BeanFactory,这是一种典型的抽象工厂方法;Spring中一系列各种各样的Bean工厂,也即IOC容器为开发者管理对象间的依赖关系提供了很多便利和基础服务。BeanFactory作为顶层工厂接口,定义了IOC的基本功能规范;BeanFactory三个重要的子类:1:ListableBeanFactory:这个类型的BeanFactory表示其所维护的Bean是可列表化的;2:HierarchicalBeanFactory:这个类型的BeanFactory表示其所维护的Bean相互间是有继承关系的,也就是两个Bean之间肯能是有父子关系的;3:AutowiredCapableBeanFactory:这个类型的BeanFactory表示其所维护的Bean是需要自动装配的,Bean中维护了自动装配规则;最终的默认实现类为:DefaultLisableBeanFactory,它实现了所有的接口;
AbstractRefreshableConfigApplicationContext
创建IOC容器
将字符串解析为路径
解析操作的本质是将配置信息转化为Spring封装的Rrsource的过程
DefaultListableBeanFactory
DefaultBeanDefinitionDocumentReader
prepareRefresh()
定位
preProcessXml(root)
加载
BeanDefinitionReaderUtils
refreshBeanFactory()
载入Bean的方法交给子类去实现
registerBeanDefinitions(...)
doRegisterBeanDefinitions(root)
resolvePath(locations[i])
initBeanDefinitionReader(beanDefinitionReader)
XmlBeanDefinitionReader
0 条评论
回复 删除
下一页