概述
通过加载配置文件的信息,注册xml的bean配置
整体设计
知识点补充
返回指定资源的输入流
// 相对路径获取流
java.lang.ClassLoader#getResourceAsStream
// 绝对路径获取流
java.io.FileInputStream#FileInputStream(java.io.File)
// URL获取流
java.net.URLConnection#getInputStream
类图
核心类
DefaultSingletonBeanRegistry类的singletonObjects属性存放实例化后的bean
DefaultListableBeanFactory类主要存放的是beanDefinition信息,并继承AbstractAutowireCapableBeanFactory
AbstractAutowireCapableBeanFactory类的职责是管理beanDefinition的bean的初始化、实例化过程
XmlBeanDefinitionReader类主要是通过继承BeanDefinitionReader类去解析xml文件,并将xml文件的bean内容转换为对应的BeanDefinition,通过BeanDefinitionRegistry设置bean信息
- 初始化BeanFactory(DefaultListableBeanFactory)工厂
- 初始化XmlBeanDefinitionReader
调用父类AbstractBeanDefinitionReader的构造方法 - 调用XmlBeanDefinitionReader的loadBeanDefinitions方法
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="userDao" class="cn.bugstack.springframework.test.bean.UserDao"/>
<bean id="userService" class="cn.bugstack.springframework.test.bean.UserService">
<property name="uId" value="10001"/>
<property name="userDao" ref="userDao"/>
</bean>
</beans>
获取AbstractBeanDefinitionReader中的resourceLoader对象
通过工厂、策略方法获取指定的Resource子类
调用loadBeanDefinitions加载beanDefinitions
得到IO流
解析IO流,遍历childNodes通过NodeName为bean解析bean信息(id、name、class)
获取beanName:id(优先级)>className(优先级)
初始化beanDefinition
通过xml中的配置设置beanDefinition属性,如果ref是空取value作为对象值
初始化beanDefinition
如果DefaultListableBeanFactory中的beanDefinitionMap有相同的beanName报错
在BeanDefinitionRegistry接口中注册(流程如上几章节)
小结
主要分为两部分:
解析配置文件,并将配置文件信息转换为对应BeanDefinition
初始化beanDefinition(目前指定的是CgLib)
通过beanDefinition的propertyValues去实例化初始化对象的属性