Spring的IOC容器启动过程分析

IOC配置元信息读取和解析(读xml读bean的注解的方式),IOC容器生命周期(主要指IOC创建,prepare的refreshBeanFactory的点是可以让子类去扩展的,继承方式不太灵活,同样的方式有个后置处理postprocessor那个beanFactory方法也是可以这样操作的同时还有一些事件发布,启动时候的事件,关闭的时候事件,停止时候的事件,国际化即读取resourcebundle,读取一个本地文件,本地文件为一个静态资源文件或连接数据库,这些可以扩展),

        //创建BeanFactory
        AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
        //将当前类作为MetaDataSearchService作为配置类(configuration class)
        applicationContext.register(MetaDataSearchService.class);
        //启动应用上下文
        applicationContext.refresh();

       //关闭应用上下文
        applicationContext.close();

  refresh源码分析如下:

synchronized(startupShutdownMonitor)加锁因为任意application可以随意创建,所以可以在多线程下创建

prepareRefresh();中记录启动时间  initPropertySources();初始化属性资源文件getEnvironment().validateRequiredProperties();校验必须属性对象

obtainFreshBeanFactory()中Tell the subclass to refresh the internal bean factory.通过子类实现通过空实现或抽象实现

即子类AbstractRefreshableApplicationContext中实现创建DefaultListableBeanFactory beanFactory = createBeanFactory();并读取loadBeanDefinitions(beanFactory);可能在外部线程不安全,又加把锁synchronized (this.beanFactoryMonitor) ,refreshBeanFactory可能不在主流程被调,可能在其他分支被调用

obtainFreshBeanFactory()之后beanFactory只是实例化,还没有初始化

初始化prepareBeanFactory(beanFactory)中:

environment 可以通过依赖查找的方式找到beanFactory.registerSingleton注入进去

        // Register default environment beans.
        if (!beanFactory.containsLocalBean(ENVIRONMENT_BEAN_NAME)) {
            beanFactory.registerSingleton(ENVIRONMENT_BEAN_NAME, getEnvironment());
        }

beanFactory作为一个非bean的方式注入进去

        beanFactory.registerResolvableDependency(BeanFactory.class, beanFactory);

接下来进一步初始化,自定义beanFactory初始化,对容器的调整

postProcessBeanFactory(beanFactory);

invokeBeanFactoryPostProcessors(beanFactory);中BeanFactoryPostProcessor扩展这个接口

对用户bean调整registerBeanPostProcessors

initMessageSource初始化国际化,applicationContext 与beanFactory的根本区别

initApplicationEventMulticaster初始化应用事件广播,具有事件特性

registerListeners注册监听器

finishBeanFactoryInitialization注册上下文

applicationContext 启动过程中会经过一些基本操作,创建我们的beanFactory,并且进行初步的初始化,加入内建的一些bean对象或bean依赖,以及加上一些内建的非bean依赖,此时到prepareBeanFactory(beanFactory);第二部分关于BeanFactory的扩展点通过BeanFactoryPostProcessors执行来执行,此时自己定义bean添加进来,此时到invokeBeanFactoryPostProcessors(beanFactory);BeanFactory扩展添加注解驱动或aware接口回调;第三部分对bean的修改或扩展,通过执行BeanPostProcessors,此时只是注册,具体的调用在beanFactory里面进行操作;接下来定义国际化事件,资源操作通过extends的DefaultResourceLoader

//关闭应用上下文
applicationContext.close();

执行shutdownHook,doClose()中destroyBeans()销毁所有bean并且closeBeanFactory()进一步的onClose()是protected子类有进一步操作,目前内建没有实现,可以扩展applicationContext ,通过继承的方式来实现你后续的一个回调,

你可能感兴趣的:(spring,data,springboot)