spring bean 的加载机制(源码分析)

本文涉及的产品
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
全局流量管理 GTM,标准版 1个月
云解析 DNS,旗舰版 1个月
简介: 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:


bb0bf7543226c4ada238d93363f864d39da8e3e8


     在平常开发中,我们也可以使用Resource 获取 资源文件:


  Resource resource = new ClassPathResource("application.xml");
  InputStream in = resource.getInputStream();

  

step2:


13bd511377c0957e4ef8daebdf457585a9acabea


      在资源实现加载之前,调用了 super(parentBeanFactory) --  /**Ignore the given dependency interface for autowiring.(忽略接口的自动装配功能)*/

      调用XmlBeanDefinitionReader 的 loadBeanDefinitions()方法进行加载资源:

      (1) 对Resource资源进行编码

      (2) 通过SAX读取XML文件来创建InputSource对象

      (3) 核心处理

7613f54877fef111ccbe68f2c3a96a9588029fb3

     

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

4b3425c37260bbb7e68ace81867259089871a0db


      在doLoadDocument方法里面还存一个方法getValidationModeForResource()用来读取xml的验证模式。(和我关心的没什么关系,暂时不看了~)


      转换成document也是最常用的方法:

     869effccb2e4f7b69e0b53d17fe0a2b50044d61b



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

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


2daf08bfd105a15d3c5eaf411fdb0083b3969f81


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

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


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

46ca5d8a7167fb010024f79e1f334820d7d2080a


开始解析:

43eb5d219f00c7b5c99c0eed0828b9ff2550af41

   

-------------


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

     一种是默认的:  <bean id = " " class = " " />

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

fecfb37a9f121df42d5754f6fdf99367539936c6


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


对于默认标签的解析:

2b3bba761875a27d4ca52d72e76de934a90e51a1


对Bean 配置的解析:


8dac08836a4c27f90d15355991774186886ef141


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




f163a5df0d4ea8e105526fa7ef39547a1c188047


b93c6e1209359777b877f17e203e6226a269f4e0




这边代码大致看下来:

  1.   提取元素中的id和name属性
  2.   进一步解析将其他属性封装到 BeanDefinition 的实现类中
  3.   如果没有指定beanName 变使用默认规则生成beanName
  4. 封装类BeanDefinitionHolder


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

     

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

917b789f984dee75d3b2748d885dcdd6541df8fe

      在配置文件中,可以定义父<bean>和子<bean>,父<bean>是用RootDefinition来表示,子<bean>是用ChildBeanDefinition来表示。

      Spring 通过BeanDefiniton将配置文件中的<bean>配置信息转换为容器内部表示,并且将这些BeanDefinition注册到BeanDefinitonRegistry中。

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


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


83cf6bccba49fb369d0221e7970187041da349f0


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


89c0d5422e0495347f18fa03110bfb2afa255493






      









目录
相关文章
|
2月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
18天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
18天前
|
XML Java 数据格式
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
Spring 第二节内容补充 关于Bean配置的更多内容和细节 万字详解!
110 18
Spring IOC—基于XML配置Bean的更多内容和细节(通俗易懂)
|
5天前
|
XML Java 数据格式
spring复习02,xml配置管理bean
详细讲解了Spring框架中基于XML配置文件管理bean的各种方式,包括获取bean、依赖注入、特殊值处理、属性赋值、集合类型处理、p命名空间、bean作用域及生命周期和自动装配。
spring复习02,xml配置管理bean
|
5天前
|
XML Java 数据格式
spring复习03,注解配置管理bean
Spring框架中使用注解配置管理bean的方法,包括常用注解的标识组件、扫描组件、基于注解的自动装配以及使用注解后的注意事项,并提供了一个基于注解自动装配的完整示例。
spring复习03,注解配置管理bean
|
2月前
|
XML Java 数据格式
Spring5入门到实战------5、IOC容器-Bean管理(三)
这篇文章深入探讨了Spring5框架中IOC容器的高级Bean管理,包括FactoryBean的使用、Bean作用域的设置、Bean生命周期的详细解释以及Bean后置处理器的实现和应用。
Spring5入门到实战------5、IOC容器-Bean管理(三)
|
2月前
|
XML Java 数据格式
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
这篇文章是Spring5框架的入门教程,详细讲解了IOC容器中Bean的自动装配机制,包括手动装配、`byName`和`byType`两种自动装配方式,并通过XML配置文件和Java代码示例展示了如何在Spring中实现自动装配。
Spring5入门到实战------6、IOC容器-Bean管理XML方式(自动装配)
|
2月前
|
XML Java 数据格式
Spring5入门到实战------8、IOC容器-Bean管理注解方式
这篇文章详细介绍了Spring5框架中使用注解进行Bean管理的方法,包括创建Bean的注解、自动装配和属性注入的注解,以及如何用配置类替代XML配置文件实现完全注解开发。
Spring5入门到实战------8、IOC容器-Bean管理注解方式
|
2月前
|
Java Spring
|
2月前
|
前端开发 Java 开发者