美文网首页
1-1容器的基本实现-Spring 源码分析

1-1容器的基本实现-Spring 源码分析

作者: 呆_fe39 | 来源:发表于2020-03-22 17:06 被阅读0次

    看文章之前 首先问自己几个问题

     1 容器是什么?

     2 容器有什么作用?  维护Map<beanName,BeanDefinition> 的映射关系

     3 容器实现原理? 

     4.容器有哪些? XmlBeanFactory 和AppContext有什么区别?

    一 . Spring的核心类 DefaultListableBeanFactory 和 XmlBeanFactory :

    1.DefaultListableBeanFactory 是Spring注册加载bean的默认实现

    2. XmlBeanFactory 继承了 DefaultListableBeanFactory 并且进行了扩展 ,使用了自定义的XML读取器 XmlBeanDefinitionReader

    二 .首先我们来一个简单的列子:

    1创建Account

    2给Account bean 配置

    3测试

    4例子简单的分析

    BeanFactory bf =new XmlBeanFactory(new ClassPathResource("super-bean.xml")); 

    1.Resource resource = new ClassPathResource("super-bean.xml")   资源加载器 通过资源文件的路径 找到并加载资源返回Resource

    2.new XmlBeanFactory(Resource resource)   XmlBeanFactory调用XmlBeanDefinitionReader.loadBeanDefinitions(resource)加载并注册资源 

    三 .接下来我们跟着资源文件加载封装过程来进行分析:

    1.资源加载器根据资源文件的路径找到资源文件并加载 获得Resorce

    2.将Resorce封装成EncodedResource (加入了编码元素)

    3.获取EncodedResource中的资源输入流  将InputSource实例化 并设置encoding参数

        -- 1. InputStream inputStream = encodedResource.getResource().getInputStream();

        -- 2.InputSource inputSource =new InputSource(inputStream); inputSource.setEncoding(encodedResource.getEncoding());

    4. 加载资源文件并获取Document

        -- 1.获取对XML的验证模式 (XmlBeanDefinitionReader#getValidationModeForResource(resource))

        --2.创建DocumentBuilderFactory 然后通过DocumentBuilderFactory创建DocumentBuilder进而解析InputSource创建Document

    5.获取Element (Document.getDocumentElement())

    四.解析及注册BeanDefinition

    其实 2-5都是在XmlBeanDefinitionReader中完成的,XmlBeanDefinitionReader 对XML配置资源文件读取 解析 现在已经拿到资源元素Element ,那接下来就可以进行Bean注册了,XmlBeanDefinitionReader 将注册bean的工作委托给BeanDefinitionDocumentReader,如下图所示:

    我们来分析一下documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

    4.1 首先 获取参数 XmlReaderContext    readerContext = createReaderContext(resource);

      XmlReaderContext 继承了 ReaderContext 并扩展XmlBeanDefinitionReader,NamespaceHandlerResolver等参数

           -- 1. XmlBeanDefinitionReader:XML配置读取器

           -- 2. NamespaceHandlerResolver : 可以通过namespaceUri来获取NamespaceHandler

    4.2 进入DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions(Element root)

    这个方法里总结出来就三个点

    1.获取BeanDefinitionParserDelegate实例----->  createDelegate(getReaderContext(), root, parent)  并向监听器中注册defaultsDefinition(上面4.1 分析说道 首先通过getReaderContext() 获取参数 XmlReaderContext ,XmlReaderContext继承了ReaderContext,这里的监听器就是eventListener))

    BeanDefinitionParserDelegate中包含基本配置参数的定义和注册的bean的方法,如下图所示:

    2.获取环境变量profile (通常用来区分生产环境和开发环境)

    3标签解析&注册bean --->parseBeanDefinitions(root, this.delegate);

          Spring中标签分为两种 

         1.Spring默认的标签 如<bean id="account" class

         2.自定义标签  如<aop:aspectj-autoproxy

    简单流程图如下:

    spring默认标签和自定义标签解析流程图

    相关文章

      网友评论

          本文标题:1-1容器的基本实现-Spring 源码分析

          本文链接:https://www.haomeiwen.com/subject/hbvlyctx.html