Spring懒加载的单例Bean获取过程是怎样的

这篇文章主要讲解了“Spring懒加载的单例Bean获取过程是怎样的”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring懒加载的单例Bean获取过程是怎样的”吧!

站在用户的角度思考问题,与客户深入沟通,找到向阳网站设计与向阳网站推广的解决方案,凭借多年的经验,让设计与互联网技术结合,创造个性化、用户体验好的作品,建站类型包括:网站设计、做网站、企业官网、英文网站、手机端网站、网站推广、域名申请、虚拟空间、企业邮箱。业务覆盖向阳地区。

前言

xml的读取应该是Spring的重要功能,因为Spring的大部分功能都是以配置做为切入点的。

   我们在静态代码块中读取配置文件可以这样做:
   //这样来加载配置文件    
   XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
   (1)XmlBeanFactory 继承 AbstractBeanDefinitionReader ,使用ResourceLoader 将资源文件路径转换为对应的Resource文件。
   (2)通过DocumentLoader 对 Resource 文件进行转换,将 Resource 文件转换为 Document 文件。
   (3)通过实现接口 BeanDefinitionDocumentReader 的 DefaultBeanDefinitionDocumentReader 类对Document 进行解析,并且使用 BeanDefinitionParserDelegate对Element进行解析。

step1:

Spring懒加载的单例Bean获取过程是怎样的

 在平常开发中,我们也可以使用Resource 获取 资源文件:
  Resource resource = new ClassPathResource("application.xml");
  InputStream in = resource.getInputStream();

step2:

Spring懒加载的单例Bean获取过程是怎样的

  在资源实现加载之前,调用了 super(parentBeanFactory) --  /**Ignore the given dependency interface for autowiring.(忽略接口的自动装配功能)*/
  调用XmlBeanDefinitionReader 的 loadBeanDefinitions()方法进行加载资源:
  (1) 对Resource资源进行编码
  (2) 通过SAX读取XML文件来创建InputSource对象
  (3) 核心处理

Spring懒加载的单例Bean获取过程是怎样的

   可以很直观的看出来是这个function是在解析xml文件从而获得对应的Document对象。

Spring懒加载的单例Bean获取过程是怎样的

  在doLoadDocument方法里面还存一个方法getValidationModeForResource()用来读取xml的验证模式。(和我关心的没什么关系,暂时不看了~)
  转换成document也是最常用的方法:
 ![869effccb2e4f7b69e0b53d17fe0a2b50044d61b](/upload/otherpic70/869effccb2e4f7b69e0b53d17fe0a2b50044d61b.png)

step3 : 我们已经step by step 的看到了如何将xml文件转换成Document的,现在就要分析是如何提取和注册bean的。

        /**Register the bean definitions contained in the given DOM document*/

Spring懒加载的单例Bean获取过程是怎样的

参数doc是doLoadBeanDefinitions()方法传进来的  loadDocument 加载过来的。这边就很好的体现出了面向对象的单一全责原则,将逻辑处理委托給单一的类去处理。

在这边单一逻辑处理类是:  BeanDefinitionDocumentReader

核心方法:  documentReader.registerBeanDefinitions(doc, createReaderContext(resource));

Spring懒加载的单例Bean获取过程是怎样的开始解析:Spring懒加载的单例Bean获取过程是怎样的


在Spring的xml配置中有两种方式来声明bean:

 一种是默认的:  
 还有一种是自定义的:  < tx : annotation-driven / >

Spring懒加载的单例Bean获取过程是怎样的

通过xml配置文件的默认配置空间来判断: http://www.springframework.org/schema/beans

对于默认标签的解析:

Spring懒加载的单例Bean获取过程是怎样的

对Bean 配置的解析:

Spring懒加载的单例Bean获取过程是怎样的

BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);  返回BeanDefinitionHolder

Spring懒加载的单例Bean获取过程是怎样的

Spring懒加载的单例Bean获取过程是怎样的

这边代码大致看下来:

  1. 提取元素中的id和name属性

  2. 进一步解析将其他属性封装到 BeanDefinition 的实现类中

  3. 如果没有指定beanName 变使用默认规则生成beanName

  4. 封装类BeanDefinitionHolder

可以先了解一下  BeanDefinition  这个类的作用。

  BeanDefinition是一个接口,对应着配置文件中里面的所有配置,在Spring中存在着三个实现类:

Spring懒加载的单例Bean获取过程是怎样的

  在配置文件中,可以定义父和子,父是用RootDefinition来表示,子是用ChildBeanDefinition来表示。
  Spring 通过BeanDefiniton将配置文件中的配置信息转换为容器内部表示,并且将这些BeanDefinition注册到BeanDefinitonRegistry中。

Spring容器的BeanDefinitonRegistry就像是Spring配置信息的内存数据库,主要是以map的形式保存的。

 因此解析属性首先要创建用于承载属性的实例:

Spring懒加载的单例Bean获取过程是怎样的

然后就是各种对属性的解析的具体方法:

Spring懒加载的单例Bean获取过程是怎样的

感谢各位的阅读,以上就是“Spring懒加载的单例Bean获取过程是怎样的”的内容了,经过本文的学习后,相信大家对Spring懒加载的单例Bean获取过程是怎样的这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是创新互联,小编将为大家推送更多相关知识点的文章,欢迎关注!


文章名称:Spring懒加载的单例Bean获取过程是怎样的
地址分享:http://scyanting.com/article/pcihii.html