• spring来源理解-BeanFactory子类XmlBeanFactory创建过程


    BeanFactory

    1:BeanFactory什么:

    官方解释The root interface for accessing a Spring bean container,翻译成中文spring bean容器的最基本接口,也就是作为一个spring容器,必须实现它。

    2:BeanFactory容器乘的要内容是什么

    This interface is implemented by objects that hold a number of bean definitions

    2.1他能够乘bean definitions。

    对于bean definitions是什么东东,应该看BeanDefinition这个类的定义:A BeanDefinition describes a bean instance, which has property values,constructor argument values, and further information supplied byconcrete implementations.说白了就是对<bean></bean>标签内容的解析,不过不过xml中<bean>的解析。并非实例化的对象。跟踪BeanFactory的实现类XmlBeanFactory代码发现事实上现了接口BeanDefinitionRegistry。定义了对BeanDefinition的增删改查等操作

    2.2他能够乘单例对象

    详细实例化对象的注冊位置(通常是单例的。对于原型没有必要保存)。跟踪BeanFactory的实现类XmlBeanFactory代码发现事实上现了接口SingletonBeanRegistry,在这个接口了,专门定义了单例对象的增增删改查等操作。

    XmlBeanDefinitionReader

    从xml中读取bean definitions。将xml解析成dom文档,并通过一个实现了 BeanDefinitionDocumentReader接口的对象来解析该dom文档,终于将xml的标签解析为BeanDefinition对象。

    BeanDefinitionDocumentReaderBeanDefinitionParserDelegate

    将dom文档终于解析为BeanDefinition,并加入到BeanDefinition容器中。

    详细的操作流程

    BeanFactory bf = new XmlBeanFactory(new ClassPathResource("spring.xml"));


    1 在XmlBeanFactory的构造函数中运行
    this.reader.loadBeanDefinitions(resource);
    reader为其一个字段
    private final XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(this);
    

    2在loadBeanDefinitions中主要运行的为
    doLoadBeanDefinitions(inputSource, encodedResource.getResource())
    3在doLoadBeanDefinitions中主要运行的为
    registerBeanDefinitions(doc, resource);
    4获取BeanDefinitionDocumentReader并运行
    registerBeanDefinitions(doc, createReaderContext(resource));
    5在registerBeanDefinitions方法中主要运行的为
    parseBeanDefinitions(root, delegate);
    6通过delegate对dom文档进行解析
    delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
    解析类型非常多,再次仅仅是为特殊标签进行了解析
    7对解析完毕的BeanDefinition进行注冊
    BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());

    解析的xml

    <beans xmlns="http://www.springframework.org/schema/beans"
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
    	xsi:schemaLocation="http://www.springframework.org/schema/beans
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
     http://www.springframework.org/schema/aop
     http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">
    		<bean id="person" class="model.Person">
    		<property name="name">
    			<value>lisi</value>
    		</property>
    		<property name="sex">
    			<value>boy</value>
    		</property>
    	</bean>
    </beans>

    解析流程图




    注意:此博客为我第一次阅读spring源代码,源代码内容为spring3.0.当中的错误之处请多包涵并欢迎指正。流程图也存在不规范之处

    版权声明:本文博主原创文章,博客,未经同意不得转载。

  • 相关阅读:
    状压DP入门
    二分图匹配(最大匹配:匈牙利算法)
    序列自动机入门
    Trie树入门+例题(字典树,前缀树)
    扩展KMP算法(Z-Algorithm)
    Oracle锁表查询和解锁方法
    oracle获取系统日期--当前时间+前一天+当前月+前一个月
    oracle获取年月日,两个日期相减
    oracle decode函数和 sign函数
    expdp、impdp数据泵导出导入数据
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/4887521.html
Copyright © 2020-2023  润新知