美文网首页
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