BeanFactory
BeanFactory,是访问Spring bean容器的根接口,这个接口是由包含许多bean definition的对象实现的,每个bean definition都由一个字符串名惟一标识。是实现IoC根容器的顶层接口,在Spring中许多重要的组件也直接或间接的继承了BeanFactory,例如ApplicationContext:
Spring是如何根据用户定义的xml文件,将bean对象加载到容器的呢?
在resources目录下定义了一个beans.xml,分析下这段代码:
再回到XmlBeanFactory的构造方法中:
root就是当前xml文件的根元素beans标签。
我们先跟进this.delegate = createDelegate(getReaderContext(), root, parent);这行代码看看:
回到之前的parseBeanDefinitions(root, this.delegate);这行代码,在跟进去:
回到processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate)方法:
但是在spring 3.1之后,XmlBeanFactory被spring标注为过时了。
XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
等价于:
总结
Spring加载资源及装配对象的过程:
1、定义好bean的配置文件。
2、通过Resource对象将bean配置文件进行抽象,抽象成一个Resource对象。
3、定义好bean工厂(各种BeanFactory)。
4、定义好XmlBeanDefinitionReader对象,并将工厂作为参数传递进去供后续回调使用。
5、通过XmlBeanDefinitionReader对象读取之前抽象出的Resource对象(包含Xml文件解析过程)。
6、本质上,Xml文件的解析是由XmlBeanDefinitionReader对象交由BeanDefinitionParserDelegate委托来完成的,实际上这里使用了委托模式。
7、IoC容器创建完毕,用户可以通过容器获取到所需的对象。