美文网首页
Spring容器内部工作机制

Spring容器内部工作机制

作者: 忘净空 | 来源:发表于2016-12-26 09:46 被阅读66次

    Spring启动时执行的操作

    AbstractApplicationContext是ApplicationContext的抽象实现类,它的refresh方法定义了Spring启动时执行的操作。

    AbstractApplicationContext中refresh()方法源码片段

    使用设计模式的模版模式
    //初始化BeanFacoty
    prepareRefresh();
    ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
    prepareBeanFactory(beanFactory);
    
    // Allows post-processing of the bean factory in context subclasses.
    postProcessBeanFactory(beanFactory);
    
    // 调用后工厂后置处理器
    invokeBeanFactoryPostProcessors(beanFactory);
    
    // 注册Bean后置处理器
    registerBeanPostProcessors(beanFactory);
    
    // 初始化消息源
    initMessageSource();
    
    // 初始化容器事件广播器
    initApplicationEventMulticaster();
    
    // 初始化其他特殊的Bean,这是个钩子方法,子类中具体实现
    onRefresh();
    
    // 注册事件监听器
    registerListeners();
    
    // 初始化所有单例的Bean
    finishBeanFactoryInitialization(beanFactory);
    
    //完成刷新并发布容器刷新事件
    finishRefresh();
    
    
    Spring启动时执行的操作图
    1. ResourceLoader从存储介质中加载spring配置信息,并使用Resource标识这个配置文件的资源。

    2. BeanDefinitionReader读取Resource所指向的配置文件资源,然后解析配置文件,配置文件中的每一个<bean>被解析成一个BeanDefinition对象,并保存到BeanDefinitionRegistry中。

    3. 容器扫描BeanDefinitionRegistry中的BeanDefinition,使用Java的反射机制自动识别出Bean工厂后处理器的Bean,然后调用这些Bean工厂处理器对BeanDefinfitionRegistry中的BeanDefinition进行加工处理,主要完成两项工作:

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

    (2)对BeanDefinitionRegistry中的BeanDefinition进行扫描,通过Java反射机制找出所有属性编辑器的Bean,并自动将他们注册到Spring容器的属性编辑器注册表中。

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

    2. 在实例化Bean时,Spring容器使用BeanWrapper对Bean进行封装,BeanWrapper提供了很多以Java反射机制操作Bean的方法,它将结合Bean的BeanDefinition以及容器中的属性编辑器,完成Bean属性的设置工作。

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

    相关文章

      网友评论

          本文标题:Spring容器内部工作机制

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