决战圣地玛丽乔亚Day41 ----Spring启动流程之refresh()源码分析

3.this.refresh():

 

 

 refresh的整体结构

1.Spring应用上下文启动准备阶段

this.prepareRefresh();

记录了应用程序的启动时间,并设置为活跃状态。

根据日志的打印规范打印所需内容

初始化属性(系统变量、环境变量、配置文件等)并进行验证。

 

 

 这段代码:

如果早期监听器存在,说明早期阶段注册了监听器,就把监听器集合清空,把早期监听器存进去。

如果早起监听器不存在,说明早期没有注册任何事件监听器,就把监听器集合赋给早期监听器。

监听器的作用:
ApplicationListener可以让相匹配的事件自动调用onApplicationEvent方法。

最后new一个空的earlyApplicationEvents()集合

 

2.BeanFactory创建阶段

 

 

 

 

 

 

 

 

 

 

 

 这里的refreshed用了原子类

如果重复刷新,会报错抛出,如果没有重复刷新过,设置BeanFactory的序列化id。

通过原子变量refreshed判断是否刷新过。

BeanFactory的序列化id以便反序列化进行核实。

为什么BeanFactory需要被反序列化?

BeanFactory需要反序列化的原因是,BeanFactory在应用程序运行过程中可能会被序列化到磁盘或通过网络传输,在反序列化时需要重新加载Bean定义以及相关的配置信息,以便重新创建Bean实例。例如,在分布式应用程序中,BeanFactory可能会被序列化到远程服务器上,并在远程服务器上反序列化并重新创建Bean实例,以提供服务。

 

3.BeanFactory准备阶段

this.prepareBeanFactory(beanFactory);

 

 

 设置当前应用程序的ClassLoader为BeanFactory的ClassLoader。

 

 

 设置BeanFactory的表达式解析器为StandardBeanExpressionResolver,并将BeanFactory的ClassLoader作为参数传递给解析器。

 

 

 注册一个ResourceEditorRegistrar,用于将资源文件转换为Resource对象。

 

 

 后置处理器添加一个ApplicationContextAwareProcessor,用于在Bean创建过程中注入ApplicationContext对象。

 

 

 忽略这些接口,不会自动注入到bean,需要手动注入到bean中

 

 

 注册一个ResolvableDependency,用于解决BeanFactory、ResourceLoader、ApplicationEventPublisher和ApplicationContext的依赖关系。

 

 

为这个beanFactory添加bean的后置处理 

添加一个ApplicationListenerDetector,用于检测Bean是否实现了ApplicationListener接口

如果BeanFactory中包含名为"loadTimeWeaver"的Bean,则添加一个LoadTimeWeaverAwareProcessor,

用于在Bean创建过程中注入LoadTimeWeaver对象,并设置临时ClassLoader为ContextTypeMatchClassLoader。

 如果BeanFactory中不包含名为"environment"、"systemProperties"和"systemEnvironment"的Bean,则注册这三个Bean。其中,"environment"为当前应用程序的环境对象,"systemProperties"为系统属性对象,"systemEnvironment"为系统环境对象。

在准备阶段有两个addBeanPostProcessor后置处理器,一个是

beanFactory.addBeanPostProcessor(new ApplicationContextAwareProcessor(this));
beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(this));

来看一下这两个处理器是用来干什么的。

ApplicationContextAwareProcessor:如果bean实现了ApplicationContextAware接口,则调用setApplicationContext方法将ApplicationContext对象注入到Bean中。

ApplicationListenerDetector:如果Bean实现了ApplicationListener接口,则ApplicationListenerDetector会将该Bean添加到Spring事件监听器列表中,以便在事件发生时执行相应的处理逻辑。

关于Aware接口的作用:

1.标记接口,实现该接口一般会有一个BeanPostProcessor类对其处理

2.具体方法的定义由实现了该接口的子接口进行定义,但是通常该子接口应该只包含一个方法,且该方法的返回值为void,参数只有一个

 

 

4.BeanFactory后置处理阶段

 

 

 

 

 

 这里没有做任何处理,可以通过重写的方式进行处理或者实现BeanFactoryPostProcessor接口

5.BeanFactory注册BeanPostProcessor阶段

this.getBeanFactoryPostProcessors是返回所有已注册的BeanFactoryPostProcessor实现类

PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, this.getBeanFactoryPostProcessors())的作用是:

调用所有注册到BeanFactoryPostProcessor接口的实现类的postProcessBeanFactory方法,对BeanFactory进行进一步的配置和修改。

public static void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory, List<BeanFactoryPostProcessor> beanFactoryPostProcessors) {
        Set<String> processedBeans = new HashSet();
        ArrayList regularPostProcessors;
        ArrayList registryProcessors;
        int var9;
        ArrayList currentRegistryProcessors;
        String[] postProcessorNames;
        if (beanFactory instanceof BeanDefinitionRegistry) {
            BeanDefinitionRegistry registry = (BeanDefinitionRegistry)beanFactory;
            regularPostProcessors = new ArrayList();
            registryProcessors = new ArrayList();
            Iterator var6 = beanFactoryPostProcessors.iterator();

            while(var6.hasNext()) {
                BeanFactoryPostProcessor postProcessor = (BeanFactoryPostProcessor)var6.next();
                if (postProcessor instanceof BeanDefinitionRegistryPostProcessor) {
                    BeanDefinitionRegistryPostProcessor registryProcessor = (BeanDefinitionRegistryPostProcessor)postProcessor;
                    registryProcessor.postProcessBeanDefinitionRegistry(registry);
                    registryProcessors.add(registryProcessor);
                } else {
                    regularPostProcessors.add(postProcessor);
                }
            }

            currentRegistryProcessors = new ArrayList();
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            String[] var16 = postProcessorNames;
            var9 = postProcessorNames.length;

            int var10;
            String ppName;
            for(var10 = 0; var10 < var9; ++var10) {
                ppName = var16[var10];
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

            sortPostProcessors(currentRegistryProcessors, beanFactory);
            registryProcessors.addAll(currentRegistryProcessors);
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            currentRegistryProcessors.clear();
            postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
            var16 = postProcessorNames;
            var9 = postProcessorNames.length;

            for(var10 = 0; var10 < var9; ++var10) {
                ppName = var16[var10];
                if (!processedBeans.contains(ppName) && beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                    processedBeans.add(ppName);
                }
            }

            sortPostProcessors(currentRegistryProcessors, beanFactory);
            registryProcessors.addAll(currentRegistryProcessors);
            invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
            currentRegistryProcessors.clear();
            boolean reiterate = true;

            while(reiterate) {
                reiterate = false;
                postProcessorNames = beanFactory.getBeanNamesForType(BeanDefinitionRegistryPostProcessor.class, true, false);
                String[] var19 = postProcessorNames;
                var10 = postProcessorNames.length;

                for(int var26 = 0; var26 < var10; ++var26) {
                    String ppName = var19[var26];
                    if (!processedBeans.contains(ppName)) {
                        currentRegistryProcessors.add(beanFactory.getBean(ppName, BeanDefinitionRegistryPostProcessor.class));
                        processedBeans.add(ppName);
                        reiterate = true;
                    }
                }

                sortPostProcessors(currentRegistryProcessors, beanFactory);
                registryProcessors.addAll(currentRegistryProcessors);
                invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry);
                currentRegistryProcessors.clear();
            }

            invokeBeanFactoryPostProcessors((Collection)registryProcessors, (ConfigurableListableBeanFactory)beanFactory);
            invokeBeanFactoryPostProcessors((Collection)regularPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        } else {
            invokeBeanFactoryPostProcessors((Collection)beanFactoryPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        }

        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanFactoryPostProcessor.class, true, false);
        regularPostProcessors = new ArrayList();
        registryProcessors = new ArrayList();
        currentRegistryProcessors = new ArrayList();
        postProcessorNames = postProcessorNames;
        int var20 = postProcessorNames.length;

        String ppName;
        for(var9 = 0; var9 < var20; ++var9) {
            ppName = postProcessorNames[var9];
            if (!processedBeans.contains(ppName)) {
                if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                    regularPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
                } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                    registryProcessors.add(ppName);
                } else {
                    currentRegistryProcessors.add(ppName);
                }
            }
        }

        sortPostProcessors(regularPostProcessors, beanFactory);
        invokeBeanFactoryPostProcessors((Collection)regularPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        List<BeanFactoryPostProcessor> orderedPostProcessors = new ArrayList(registryProcessors.size());
        Iterator var21 = registryProcessors.iterator();

        while(var21.hasNext()) {
            String postProcessorName = (String)var21.next();
            orderedPostProcessors.add(beanFactory.getBean(postProcessorName, BeanFactoryPostProcessor.class));
        }

        sortPostProcessors(orderedPostProcessors, beanFactory);
        invokeBeanFactoryPostProcessors((Collection)orderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        List<BeanFactoryPostProcessor> nonOrderedPostProcessors = new ArrayList(currentRegistryProcessors.size());
        Iterator var24 = currentRegistryProcessors.iterator();

        while(var24.hasNext()) {
            ppName = (String)var24.next();
            nonOrderedPostProcessors.add(beanFactory.getBean(ppName, BeanFactoryPostProcessor.class));
        }

        invokeBeanFactoryPostProcessors((Collection)nonOrderedPostProcessors, (ConfigurableListableBeanFactory)beanFactory);
        beanFactory.clearMetadataCache();
    }

具体细节:

 

 

 

入参 beanFactoryPostProcessors:这个值拿的是 AbstractApplicationContext 类的 beanFactoryPostProcessors 属性值,也就是在之前已经添加到 beanFactoryPostProcessors 中的 BeanFactoryPostProcessor
实现 BeanDefinitionRegistryPostProcessor.class 接口的 Bean:实现了 BeanDefinitionRegistryPostProcessor 接口,并且 Bean 定义已经存入了 beanFactory 中
实现 BeanFactoryPostProcessor.class 接口的 Bean:实现了 BeanFactoryPostProcessor接口,并且 Bean 定义已经存入了 beanFactory 中
处理这三种 Bean 的流程也就是执行这些 Bean 中重写的 BeanFactoryPostProcessor 相关方法,那具体的执行顺序如下:

第一优先级:入参 beanFactoryPostProcessors 中的 BeanDefinitionRegistryPostProcessor, 调用 postProcessBeanDefinitionRegistry 方法
第二优先级:BeanDefinitionRegistryPostProcessor 接口实现类,并且实现了 PriorityOrdered 接口,调用 postProcessBeanDefinitionRegistry 方法
第三优先级:BeanDefinitionRegistryPostProcessor 接口实现类,并且实现了 Ordered 接口,调用 postProcessBeanDefinitionRegistry 方法

第四优先级:除去第二优先级和第三优先级,剩余的 BeanDefinitionRegistryPostProcessor 接口实现类,调用 postProcessBeanDefinitionRegistry 方法

第五优先级:所有 BeanDefinitionRegistryPostProcessor 接口实现类,调用 postProcessBeanFactory 方法


第六优先级:入参 beanFactoryPostProcessors 中的常规 BeanFactoryPostProcessor,调用 postProcessBeanFactory 方法
第七优先级:常规 BeanFactoryPostProcessor 接口实现类,并且实现了 PriorityOrdered 接口,调用 postProcessBeanFactory 方法
第八优先级:常规 BeanFactoryPostProcessor 接口实现类,并且实现了 Ordered 接口,调用 postProcessBeanFactory 方法
第九优先级:除去第七优先级和第八优先级,剩余的常规 BeanFactoryPostProcessor 接口的实现类,调用 postProcessBeanFactory 方法
其实也就是分为两类,一类是BeanDefinitionRegistryPostProcessor ,另一类是BeanFactoryPostProcessor 

BeanDefinitionRegistryPostProcessor的执行顺序是在所有的BeanFactoryPostProcessor之前,因此它可以对所有的BeanDefinition进行修改。

 

接下来就是registerBeanPostProcessors 

 

 

 

 

 

    public static void registerBeanPostProcessors(ConfigurableListableBeanFactory beanFactory, AbstractApplicationContext applicationContext) {
        String[] postProcessorNames = beanFactory.getBeanNamesForType(BeanPostProcessor.class, true, false);
        int beanProcessorTargetCount = beanFactory.getBeanPostProcessorCount() + 1 + postProcessorNames.length;
        beanFactory.addBeanPostProcessor(new PostProcessorRegistrationDelegate.BeanPostProcessorChecker(beanFactory, beanProcessorTargetCount));
        List<BeanPostProcessor> priorityOrderedPostProcessors = new ArrayList();
        List<BeanPostProcessor> internalPostProcessors = new ArrayList();
        List<String> orderedPostProcessorNames = new ArrayList();
        List<String> nonOrderedPostProcessorNames = new ArrayList();
        String[] var8 = postProcessorNames;
        int var9 = postProcessorNames.length;

        String ppName;
        BeanPostProcessor pp;
        for(int var10 = 0; var10 < var9; ++var10) {
            ppName = var8[var10];
            if (beanFactory.isTypeMatch(ppName, PriorityOrdered.class)) {
                pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
                priorityOrderedPostProcessors.add(pp);
                if (pp instanceof MergedBeanDefinitionPostProcessor) {
                    internalPostProcessors.add(pp);
                }
            } else if (beanFactory.isTypeMatch(ppName, Ordered.class)) {
                orderedPostProcessorNames.add(ppName);
            } else {
                nonOrderedPostProcessorNames.add(ppName);
            }
        }

        sortPostProcessors(priorityOrderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, (List)priorityOrderedPostProcessors);
        List<BeanPostProcessor> orderedPostProcessors = new ArrayList(orderedPostProcessorNames.size());
        Iterator var14 = orderedPostProcessorNames.iterator();

        while(var14.hasNext()) {
            String ppName = (String)var14.next();
            BeanPostProcessor pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
            orderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }

        sortPostProcessors(orderedPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, (List)orderedPostProcessors);
        List<BeanPostProcessor> nonOrderedPostProcessors = new ArrayList(nonOrderedPostProcessorNames.size());
        Iterator var17 = nonOrderedPostProcessorNames.iterator();

        while(var17.hasNext()) {
            ppName = (String)var17.next();
            pp = (BeanPostProcessor)beanFactory.getBean(ppName, BeanPostProcessor.class);
            nonOrderedPostProcessors.add(pp);
            if (pp instanceof MergedBeanDefinitionPostProcessor) {
                internalPostProcessors.add(pp);
            }
        }

        registerBeanPostProcessors(beanFactory, (List)nonOrderedPostProcessors);
        sortPostProcessors(internalPostProcessors, beanFactory);
        registerBeanPostProcessors(beanFactory, (List)internalPostProcessors);
        beanFactory.addBeanPostProcessor(new ApplicationListenerDetector(applicationContext));
    }

BeanFactoryPostProcessor 是针对 BeanFactory 的扩展,主要用在 bean 实例化之前,读取 bean 的定义,并可以修改它。

BeanPostProcessor 是针对 bean 的扩展,主要用在 bean 实例化之后,执行初始化方法前后,允许开发者对 bean 实例进行修改。

1.找出所有实现BeanPostProcessor接口的类

2.添加BeanPostProcessorChecker(主要用于记录信息)到beanFactory中

 

3.定义不同的变量用于区分: 实现PriorityOrdered接口的BeanPostProcessor、实现Ordered接口的BeanPostProcessor、普通BeanPostProcessor

 

 

 

6.初始化内建Bean:MessageSource

 国际化相关的内容

7.初始化内建Bean:Spring事件广播器

 

 

 

 

 先判断有没有自定义的ApplicationEventMulticaster,没有的话就注册一个,即new 一个SimpleApplicationEventMulticaster,用来发布事件。

8.Spring应用上下文刷新阶段

 

 

 

模板方法,留给子类扩展用的。

9.Spring事件监听器注册阶段

 

 

 

 

 

 

 

 

 

 

 

 

  1. 添加当前应用上下文所关联的ApplicationListener对象
  2. 添加BeanFactory所注册的ApplicationListener
  3. 广播早期Spring事件

10.BeanFactory初始化完成阶段

 

 

 

 

 

 

  1. 设置转换服务:如果BeanFactory中包含名为"conversionService"的Bean,并且该Bean的类型是ConversionService,则将该Bean设置为BeanFactory的转换服务。
  2. 添加嵌入式值解析器:如果BeanFactory没有嵌入式值解析器,则添加一个解析器,用于解析属性中的占位符(如"${...}")。
  3. 处理LoadTimeWeaverAware:查找所有实现了LoadTimeWeaverAware接口的Bean,并强制初始化它们,以便在BeanFactory启动时激活LoadTimeWeaver。
  4. 设置临时类加载器:将BeanFactory的临时类加载器设置为null,这意味着BeanFactory将使用默认的类加载器。
  5. 冻结配置:冻结BeanFactory的配置,以防止其他BeanFactoryPostProcessor对其进行更改。
  6. 预实例化单例:预实例化所有非懒加载的单例Bean,以便在应用程序启动时立即初始化它们。

finishBeanFactoryInitialization的作用是确保BeanFactory的正确配置和初始化,以便程序启动可以正常使用所有的bean。

 

11.Spring应用上下文启动完成阶段

 

 

 

 

  1. 清除资源缓存:清除Spring应用程序上下文中的资源缓存,包括所有的类元数据缓存和Bean名称缓存。
  2. 初始化生命周期处理器:初始化应用程序上下文的生命周期处理器,它负责管理应用程序上下文中所有bean的生命周期。
  3. 调用生命周期处理器的onRefresh方法:通知生命周期处理器,应用程序上下文已经刷新完成,可以开始启动应用程序中的生命周期bean。
  4. 发布ContextRefreshedEvent事件:在应用程序上下文刷新完成后,发布ContextRefreshedEvent事件,这将通知所有已注册的事件监听器,应用程序上下文已经准备好使用。
  5. 注册LiveBeansView:如果LiveBeansView功能已经启用,则在JMX中注册ApplicationContext,以便可以使用JConsole查看应用程序上下文中的所有bean。

总的来说,finishRefresh方法主要是为了在应用程序上下文刷新完成后,进行一些必要的清理和初始化工作,以便应用程序可以正常地运行,并且可以及时通知其他组件,应用程序已经准备好可以使用。

 

posted @ 2023-03-26 00:01  NobodyHero  阅读(29)  评论(0)    收藏  举报