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

发布时间 2023-03-26 00:09:38作者: EmiXXXt

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后置处理阶段

5.BeanFactory注册BeanPostProcessor阶段

6.初始化内建Bean:MessageSource

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

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

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

10.BeanFactory初始化完成阶段

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


扩展点有哪些?
Spring事务
 如何控制
  Transcational声明失效情况
  编程式
 事务传播机制
 多线程事务

设计模式应用
  IOC与AOP
  工厂等模式

源码
  循环依赖
  懒加载
  单/多例
  AbstractApplicationContext.refresh()

Mybatis:

  拦截器插件:

  多级缓存:

  源码:

Springboot

 自动化装配的过程