概述
通过加载配置文件的信息,注册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去实例化初始化对象的属性