Spring内部工作机制

Spring在加载配置文件的时候做了什么呢?

 先来看下ApplicationContext的几个关键顶级接口:

    1.BeanFactory

        如上篇所示

    2.ApplicaitonEventPublisher

        发布应用上下文事件的功能

    3.MessageSource

        国际化的功能

    4.ResourceLoader

        加载resource的功能

    5.LifeCycle

        会将start/stop信息发送给所有实现了这个接口的bean,达到任务调度,jms的功能

AbstractApplicationContext是ApplicationContext的抽象实现类,类中的refresh方法定义了加载配置文件时候的流程

	// Prepare this context for refreshing.
			prepareRefresh();      //字面翻译呗
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
			prepareBeanFactory(beanFactory);
			try{  	 
postProcessBeanFactory(beanFactory)//将配置文件中的bean 以Spring内部的形式保存(既以BeanDefinition的形式保存)这个方法得益于BeanFactory中 的一个顶级接口:BeanDefinitionRegisry(定义了手动注册BeanDefinition方法)
invokeBeanFactoryPostProcessors(beanFactory); //从BeanDeifnitionRegisry中找出所有实现了BeanFactoryPostProcessor的方法,并调用其postProcessBeanFactory方法.registerBeanPostProcessors(beanFactory);//注册BeanPostProcessor类,从BeanDefinitionRegistry中找出所有实现了BeanPostProcessor的类,并将它们注册到Bean后处理器的注册表中
initMessageSource();//初始化消息数据源,对应的顶级接口MessageSource
MessageSourceinitApplicationEventMulticaster();//初始化容器上下文事件广播器
ApplicaitonEventPublisheronRefresh();//初始化其他特殊的bean
registerListeners();//注册事件监听器
finishBeanFactoryInitialization(beanFactory);//初始化所有单实例的bean,懒加载的除外
finishRefresh();//发布上下文刷新事件;创建上下文刷新事件,事件广播器将事件广播到每个注册的事件监听器中}

 
 

关于Spring 从创建到销毁bean,再次可以进行进一步延伸(其实就是上篇博文的初略概述)

1.ResourceLoader 加载配置文件 

2.BeanDefinitionReader 解析配置文件,并将其注册到BeanDefinitonRegistry中,此时的beanDefinition是半成品,因为此时还无法对

占位符进行解析

3.BeanFactoryPostProcessor从beanDefinitionRegistry中进行进一步加工(解析占位符),并且将实现了PropertyEditor接口的bean注册到PropertyEditorRegistry中

4.通过InstantiationStrategy 和BeanWrapper 完成bean的实例化,并进行属性的注入

5.通过BeanPostProcessor对bean进行进一步加工


上述组件的解释:

    1.BeanDefiniton: 是bean在Spring内部的表现形式,顶级父类是BeanDefiniton <-AbstractBeanDefiniton-<ChildBeanDefiniton,RootBeanDefinition

我们知道Bean是可以配置他的父bean 的,因此顾名思义,RootBeanDefinition是parent bean,childBeanDefinition是child bean,若无parent,则直接是RootBeanDefinition,AbstractBeanDefinition 存放共有的信息

  2.InststantiationStrategy: 策略实例化接口InstantiationStrategy<-SimpleInstantiationStrategy<-CglibSubClassingInstantiationStrategy,顾名思义呗,Simple方式,就是最常用的通过构造函数,或者工厂方法创建实例 而Cglib提供动态创建子类再进行实例化的方式 这个接口仅仅对bean进行实例化,具体的属性配置任务是交给BeanWrapper执行的

          3.BeanWrapper:完成bean属性的填充工作

            BeanWrapper的几个顶级接口: 

                1.PropertyAccessor:定义了访问bean属性的方法

                2.PropertyEditorRegistry :从properEditoryRegistry中获取实现了PropertyEditor接口的实现类

            BeanWrapper先从BeanDefinitonRegistry中获取beanDefiniton,再从beanDefinition中获取propertyValue,然后配合属性编辑器对propertyValue进行转换得到属性值,然后进行赋值,重复此操作

最后bean后置处理器:benaPostProcessor 对bean进行后续加工,一个完整的bean就诞生了

猜你喜欢

转载自blog.csdn.net/Coder_Joker/article/details/80711940