• Spring——简单了解Spring容器工作机制


    简单了解Spring容器内部工作机制

      Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Spring容器在加载配置文件后的各项处理过程,这些处理过程清晰刻画了Spring容器启动时所执行的各项操作。

          (1)初始化BeanFactory:根据配置文件实例化BeanFactory,在obtainFreshBeanFactory()方法中,首先调用refreshBeanFactory()方法刷新BeanFactory,然后调用getBeanFactory()方法获取BeanFactory。在这一步中,Spring将配置文件的信息装入容器的Bean定义注册表(BeanDefinitionRegistry)中,此时Bean还未初始化。

          (2)调用工厂后处理器:根据反射机制从Bean定义注册表(BeanDefinitionRegistry)中找出所有实现了BeanFactoryPostProcessor接口的Bean,并调用其postProcessBeanFacotry()接口方法。(处理实现了对应接口的特殊Bean)。

       (3) 注册Bean后处理器:根据反射机制从BeanDefinitionRegistry中找出所有实现了BeanPostProcessor接口的Bean,并将它们注册到容器Bean后处理器的注册表中。

       (4) 初始化信息源

       (5)初始化应用上下文事件广播器。

          (6) 初始化其他特殊的Bean:这是一个钩子方法,子类可以借助这个方法执行一些特殊操作。

       (7)注册事件监听器。

       (8)初始化所有单实例的Bean,使用懒加载模式的Bean除外:初始化Bean后,将它们放到Spring容器的缓存池中。

       (9) 发布上下文刷新时间:创建上下文刷新事件,事件广播器负责将这些事件广播到每个注册的事件监听器中。

        

    Spring容器从加载配置文件到创建一个Bean的流程

      (1) RecourceLoader装载配置文件,加载配置信息,并使用Resource表示这个配置文件资源。

      (2) BeanDefinitionReader读取Resource所指向的配置文件资源,解析配置文件。配置文件中每个<Bean>解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry(Bean定义注册表)中。

      (3) 容器扫描BeanDefinitionRegistry中的BeanDefinition,使用反射机制自动识别出Bean工厂后处理器(实现了BeanFactoryPostProcessor接口的Bean),然后调用这些Bean工厂后处理器对BeanDefinitionRegistry中的BeanDefinition进行加工处理,主要进行两项工作:

        ①对使用占位符<bean>的元素标签进行解析,得到最终配置值。这意味着对一些半成品式的BeanDefinition对象进行加工处理并得到成品的BeanDefinition对象。

        ②对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过反射机制找出所有属性编辑器的Bean(实现了java.beans.PropertyEditor接口的Bean),并自动将它们注册到Spring容器的属性编辑器注册表中(PropertyEditorRegistry)。

      (4) Spring容器从BeanDefinitionRegistry中取出加工后的的BeanDefinition,并调用InstantiationStrategy着手进行Bean实例化工作。

      (5) 在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装。BeanWrapper提供了以反射机制操作Bean的方法,它将结合该Bean的BeanDefinition及容器中的属性编辑器,完成Bean属性注入工作。

      (6) 利用容器中注册的Bean后处理器,对已完成属性设置工作的Bean进行后续加工,装配出一个准备就绪的Bean。

    Spring组件简介

      BeanDefinition:

        BeanDefinition是配置文件<bean>元素标签在容器中的内部标识,<bean>标签中拥有class、scope、lazy-init等配置属性,在BeanDefinition中也提供了相应的类属性。二者是一一对应的。

        Spring通过BeanDefinition将配置文件中的<bean>配置信息转换为容器的内部标识,并将这些BeanDefinition注册到BeanDefinitionRegistry中,后续操作直接从BeanDefinitionRegisry中读取哦诶之信息。

      InstantiationStrategy

        负责根据BeanDefinition对象创建一个Bean实例,仅负责实例化Bean的操作,相当于执行new,不会参加Bean属性设置工作,属性填充由BeanWrapper完成。

      BeanWrapper

        相当于一个代理器,完成Bean属性填充工作。在Bean实例被InstantiationStrategy创建出来之后,容器将Bean实例通过BeanWrapper包装起来。Spring从容器的BeanDefinitionRegistry中获取BeanDefinition,从中获取Bean属性的配置信息ProperyValue,并使用属性编辑器对ProperyValue进行转换以得到Bean的属性值。完成属性植入工作。

      属性编辑器

        Bean的属性值在配置文件中对应的是字面值,而BeanWrapper在填充时将字面值正确转换为对应属性时就用到了属性编辑器。 任何实现了java.beans.PropertyEditor接口的类都是属性编辑器。主要功能是将外部的设置值转换为JVM内部的队友类型,实际上是一个类型转换器。

  • 相关阅读:
    location.href
    网络载入数据和解析JSON格式数据案例之空气质量监測应用
    概率dp HDU 3853
    poj2031-Building a Space Station(最小生成树,kruskal,prime)
    在JS数组指定位置插入元素
    leetcode
    leetcode笔记:Range Sum Query
    最优解算法的讨论
    NYOJ_77 开灯问题
    C++调用Lua的性能測试
  • 原文地址:https://www.cnblogs.com/ELAIRS/p/12186941.html
Copyright © 2020-2023  润新知