spring步步前行(IOC)-Spring beanFactory详解(三)

导语

上一篇我们了解对于beanPostProcessor和BeanFactoryPostProcessor,spring为我们设置一些由我们自由控制的时机。接下来我们继续我们的refresh方法分析

refresh的initMessageSource

在这里插入图片描述
这个方法就相对简单,对beanFactory进行处理,分析如下

  • 如果包含有messageSource就从beanfactory中获取且判断这个messageSource是否是HierarchicalMessageSource,如果是,就这时其父级messageSource

  • 如果没有,则新建DelegatingMessageSource作为messageSource的bean

refresh的initApplicationEventMulticaster

在这里插入图片描述
此方法也相对简单与initResource也很相似,分析如下:

  • 如果beanFactory中是否包含applicationEventMulticaster,就从beanFactory获取applicationEventMulticaser
  • 若没有,新建作为单例的SimpleApplicationEventMulticaster

我们进入SimpleApplicationEventMulticaster
在这里插入图片描述
我们关注muticastEvent看看,从其父类根据ApplicationEvent获取所有的applicationListeners,循环遍历onApplicationEvent,从这里我们可以类比观察者模式,结合AbstractApplicationEventMulticaster,我们可以了解到保存所有的listener

refresh的onRefresh

此方法是空实现,是提供的可重写以添加上下文特定刷新工作的模板方法,在初始化特殊bean时调用,在实例化单例之前

refresh的registerListeners

在这里插入图片描述
从之前的EventMulticaster中,我们知道spring的替我们初始化了一个事件处理器,而register就是向事件处理器中添加所有实现了ApplicationListener接口的类的观察listener

refresh的finishBeanFactoryInitialization

从其注释我们知道此方法是用于实例化所有非懒加载的所有bean
在这里插入图片描述

  • 首先查看是否有ConversionService在beanFactory中,如果有就向beanFactory中存放ConversionService

    public interface ConversionService {
        boolean canConvert(Class<?> var1, Class<?> var2);
    
        boolean canConvert(TypeDescriptor var1, TypeDescriptor var2);
    
        <T> T convert(Object var1, Class<T> var2);
    
        Object convert(Object var1, TypeDescriptor var2, TypeDescriptor var3);
    }
    从接口定义上看conversionService是用于一个服务接口用于类型转换,这也是转换系统的入口点
    
  • 从beanFactory中查找所有的LoadTimerWeaverAware,并实例化对应的LoadTimerWeaverAware

  • 停止临时的classloader类加载器,然后缓存所有的beanDefinition数据,最后在preInstantiateSingleton中进行实例化non-lazy-init 单例

    对于preInstantiateSingleton:
    在这里插入图片描述

    • 首先beanDifinition赋值到一个新的集合中,紧接着进行遍历操作
    • 如果不是lazyinit,也不是单例的且还是Abstract的就进行getMergedLocalBeanDefinition操作,获取缓存的BeanDefinition对象并合并其父类和本身的属性
      在这里插入图片描述
  • 接着判断是否为factoryBean,不是的话直接进行getBean进行实例化,若是,获取factoryBean,查看factoryBean是否有额外配置

refresh的finishRefresh

首先官方注释是

publish corresponding event

即:发布所有的应用
在这里插入图片描述

  • initLifecycleProcessor,LifecycleProcessor实例初始化,LifecycleProcessor是所有Lifecycle实现类的管家,里面包含了对Lifecycle的各种操作
    在这里插入图片描述
  • LifecycleProcessor的onRefresh,通过LifecycleProcessor来执行Lifecycle实现类的start方法
    在这里插入图片描述
    在这里插入图片描述
  • publishEvent,即Spring中的事件发布机制来发出ContextRefreshedEvent事件
  • 最后registerApplicationContext,如果配置了MBeanServer,就完成在MBeanServer上的注册

到这里,整个refresh方法就分析结束了,可能有很多人还是有很多疑问,其实refresh方法是spring对bean操作外置的很多处理机制,后续会继续针对refresh的这些方法,从不同的实例来换一些角度了解整个refresh方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章