为什么提这个类呢?直接说这个类可能会感到陌生,但是提到XmlBeanFactory,可能就有点感觉了吧,实际上DefaultListableBeafFactory是XmlBeanfFactory的父类。
不管是哪个BeanFactory,他们的启动过程都类似,这里以DefaultListableBeanFactory为例
启动Ioc容器的方式:
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
上面启动方式的底层实现代码:
1、ClassPathResource resource = new ClassPathResource("beans.xml");
2、DefaultListableBeanFactory factory = new DefualtListableBeanFactory();
3、XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);
4、reader.loadBeanDefinitions(resource);
spring加载资源并装配对象的大致流程:
1、定义好spring配置文件
2、通过Resource对象将Spring配置文件进行抽象,抽象成一个Resource对象
3、定义好Bean工厂(各种BeanFactory)
4、定义好XmlBeanDefinitionReader对象,并将工厂作为参数传递进去供后续回调使用
5、通过XmlBeanDefinitionReader对象读取之前抽象出的Resource对象(包含了Xml文件的解析过程)
6、本质上,XML文件的解析是由XmlBeanDefinitonReader对象交由BeanDefinitionParserDelegate委托来完成的,实质上这里使用到了委托模式
7、Ioc容器创建完毕,用户通过容器获取到所需的对象信息 例子:(Person p = (Person)factory.getBean(“person”))
几个重要参数:
1、Resource:
这个类是spring为了支持不同的资源文件(XML、prepertis等),而设定的统一的接口,把磁盘里的文件抽象成一个Resource存储到内层中,方便后续解析文件使用
2、XmlBeanDefinitionReader:
它的父类是AbstractBeanDefinitionReader,该父类的实现类除了XmlBeanDefinitionReader还有PropertiesBeanDefinitionReader等,作用就是根据不同的bean定义来源(不同类型的Resource),通过不同的解析方式,解析定义出BeanDefinition(BeanDefinition是配置文件中(磁盘)配置的bean转换到java代码(内存)中时,存储bean配置信息的普通java对象。不用纠结,后续章节会讲)。包含了Xml文件或者Properties文件等的解析过程。
3、InputStreamSource
Resource接口继承了InputStreamSource,该接口中就只有一个getInputStream()方法,用来获取Inputstream
注意:
这里有一个spring高明的地方,spring并没有把XmlBeanDefinitionReader定义成XmlBeanFactory的内置对象,而是定义成了它的一个内部属性,这样的话就给我们实现自己的beandefinition定义提供了可能,如果我们要修改spring代码,自己解析bean,则只需要我们把XmlBeanDefinitionReader这个属性替换成我们自己的类就可以了
本文介绍了Spring框架中Ioc容器的启动过程及关键组件的作用,包括Resource的使用、XmlBeanDefinitionReader的工作原理及其与XmlBeanFactory的关系。

3410

被折叠的 条评论
为什么被折叠?



