Spring源码整体脉络介绍及源码编译

需完成的任务

Spring源码整体脉络介绍及源码编译_第1张图片

类------------------------------------------BeanFactory----------------------------------------->Bean【BeanFactory调用getBean()生产出来的】

BeanFactory

Spring顶层核心接口,使用了简单工厂模式【根据名字,生产出不同的Bean实例】

BeanDefinitionReader:读取xml或者注解的信息
BeanDefinitionScanner:负责扫描筛选有加Bean注解的类【不是所有的类都配置了Bean】
BeanDefinitionRegistry:负责将Bean的所有信息打包到BeanDefinition中供生产,加入到BeanDefinitionMap中

BeanFactory和ApplicationContxet的区别

都有生产Bean的能力,其中ApplicationContxet是调用BeanFactory实现的
ApplicationContxet实现了BeanFactory
BeanFactory:只有一个职责就是生产Bean
ApplicationContxet:实现了AOP、国际化,事件,扫描器、读取器其他接口等等 还有扩展节点,如BeanFactoryPostprocessor【用于集成其他组件如mybatis】等

Spring源码整体脉络介绍及源码编译_第2张图片

Bean的生命周期/加载过程

实例化【反射】
填充属性【@Autowire@Value】
初始化
初始化的时候还要调用各种Aware方法
put到一个Map里存起来【Map
最终getBean就是从Map中获取【就是单例池或者一级缓存】

Bean生命周期

Spring源码整体脉络介绍及源码编译_第3张图片

扩展接口BeanFactoryPostProcessor【Bean工厂的后置处理器】

主要用于在调用getBean()方法之前修改Bean定义
BeanFactoryPostprocessor还有实现类BeanFactoryRegistryPostProcessor用来注册,所以这两个扩展点十分重要

BeanPostProcessor

Bean的后置处理器
Bean的实例化的时候每个步骤前前后后都会调用BeanPostProcessor【总共会调用九次】
Spring源码整体脉络介绍及源码编译_第4张图片
Bean的生命周期的初始化后进行BeanPostProcessor实现AOP功能【为了跟Bean彻底解耦】

Ioc容器加载过程-Bean的生命周期深度剖析

以加载类为例
Spring源码整体脉络介绍及源码编译_第5张图片
Spring源码整体脉络介绍及源码编译_第6张图片在这里插入图片描述

第一步

调用父类GenericApplicationContext的构造方法,第一步拿到Bean工厂
Spring源码整体脉络介绍及源码编译_第7张图片
父子类继承关系
Spring源码整体脉络介绍及源码编译_第8张图片
回到this()中,AnnotationConfigApplicationContext()构造方法,创建读取Bean定义
Spring源码整体脉络介绍及源码编译_第9张图片
在此注册了一些处理器类,如星1解析@ComponentScan等注解
Spring源码整体脉络介绍及源码编译_第10张图片

this总结1:

无参函数里面的this():总共三大步

  1. 加载Bean工厂,实例化一个Bean工厂
  2. 通过AnnotationBeanDefinitionReader注册了很多创世纪的处理器用来支撑AnnotationConfigApplicationContext后面的运行
  3. AnnotationConfigApplicationContext里还实例化Scanner用于扫描【类路径下的Bean定义扫描器】
    Spring源码整体脉络介绍及源码编译_第11张图片

第二步

注册我们的配置类到Bean定义里面

Spring源码整体脉络介绍及源码编译_第12张图片

第三步:IOC容器刷新接口refresh()

Spring中最核心的方法,体现SpringIOC的生命周期
里面有加载Bean到销毁Bean的整个过程,都在这个方法里体现了,主要体现在里面的十三个方法
这里不作全部深入,着重几个

第一个

调用相应的Bean工厂后置处理器,实例化创世纪的类,用来解析相应注解,将生成相应的Bean到Map中
在这里插入图片描述

第二个

循环所有的Bean定义,注册成最终的Bean存放到单例池中
在这里插入图片描述

BeanFactory和FactoryBean的区别

BeanFactory顶层的核心接口,使用简单的工厂模式,负责生产Bean
FactoryBean专门用来修饰普通Bean,如果普通Bean实现FactoryBean,那么就要实现FactoryBean里面的方法getObject(),当调用getBean()时,调用的是getObject()方法里的,成为特殊的一个Bean,前置&符号即可获取原来的值
Spring源码整体脉络介绍及源码编译_第13张图片

总结流程

  1. 实例化AnnotiationConfigApplicationContxet,会做几件事:实例化Reader来加载一些创世纪的类【创世纪类里面有解析一些注解,其中最重要的是解析配置类的处理器ConfigurationClassPostProcessor】,然后实例化Sanner,实例化Registry【由BeanFactory的实现类实现】,执行完这两部类还没解析成Bean定义,只是把后续的一些类给准备好这些后置处理器实现了BeanFactoryPostProcssor接口,实现这个接口,就会在refresh()方法的invokeBeanFactoryPostProcessor(),在这里会调用所有实现BeanFactoryPostProcssor接口的Bean定义从而解析配置类,注册成Bean定义
  2. 执行完invokeBeanFactoryPostProcessor()我们的Bean定义就注册好了,注册好之后就会调用finishBeanFactoryInitiaization()实例化我们所有剩余的单例,从我们的Bean定义注册成我们的Bean
  3. getBean()会做哪些事情:判断Bean是否符合生产标准;判断是不是FactoryBean,先从一级缓存中拿
  4. 如果一级缓存有的话直接返回,没有的话进入下一步
  5. 一级缓存没有的话就给它标记正在创建以解决循环依赖,再调用doCreateBean()方法进行真正的创建,在这个过程当中会调用好多的Bean后置处理器

Spring源码整体脉络介绍及源码编译_第14张图片

你可能感兴趣的:(Spring,spring,java,后端)