手撕spring05(xml解析bean)

概述

通过加载配置文件的信息,注册xml的bean配置

整体设计

知识点补充

返回指定资源的输入流

// 相对路径获取流
java.lang.ClassLoader#getResourceAsStream
// 绝对路径获取流
java.io.FileInputStream#FileInputStream(java.io.File)
// URL获取流
java.net.URLConnection#getInputStream

类图

手撕spring05(xml解析bean)_第1张图片

核心类

DefaultSingletonBeanRegistry类的singletonObjects属性存放实例化后的bean
DefaultListableBeanFactory类主要存放的是beanDefinition信息,并继承AbstractAutowireCapableBeanFactory
AbstractAutowireCapableBeanFactory类的职责是管理beanDefinition的bean的初始化、实例化过程
XmlBeanDefinitionReader类主要是通过继承BeanDefinitionReader类去解析xml文件,并将xml文件的bean内容转换为对应的BeanDefinition,通过BeanDefinitionRegistry设置bean信息

手撕spring05(xml解析bean)_第2张图片

  1. 初始化BeanFactory(DefaultListableBeanFactory)工厂
  2. 初始化XmlBeanDefinitionReader
    调用父类AbstractBeanDefinitionReader的构造方法
  3. 调用XmlBeanDefinitionReader的loadBeanDefinitions方法

<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去实例化初始化对象的属性

你可能感兴趣的:(Spring源码,xml,spring,java)