(一)Springboot原理源码解析之Springboot框架组成

目录

一、总体框架构成

1.注解组成关系

2.类继承和调用关系

二、框架总体调用流程

1.入口类中的流程

2.Spring刷新流程


一、总体框架构成

我在分析Springboot的组成部分把其分成了两部分:

  1. 注解组成及关系:主要说明了在启动过程中的关键注解互相之间的关系,以及如何调用;
  2. 具体类继承及调用关系:主要说明了在启动过程中类的互相调用关系。

1.注解组成关系

注解组成关系如下图所示:

图解分析:分析这个图总共可以分成三个部分来看:

  1. Spring扫描类注解:包括Component及其继承的自注解,以及componentScan和其子注解;
  2. AutoConfiguration类的读取:分为具体类配置读取和包读取,包括EnableAutoConfiguration和AutoConfigurationPackage通过Import注解关联起来的具体处理类;
  3. Spring框架运行时的解析类:通过EnableConfigurationProperties和ConfigurationProperties两个注解搭配和其对应的处理类搭配完成,分别完成Properties类的读取和注入进Spring工厂并和对应的配置完成绑定的操作。

2.类继承和调用关系

类继承和调用关系如下图所示:

图解分析:乍一眼看去可能感觉类有点多,实际上途中某些类只是为了展示具体的某一实现子类以便了解,我们也将其分为五个部分来看:

  1. 入口类:即初始化入口SpringApplication类,在这里类中将完成Spring工厂和Springboot特性功能的集成组装;
  2. 入口类方法流程的监听机制:这个机制可以说也是非常的巧妙,官方提供了九个对不同事件的处理类,利用监听模式完成了对yml和properties文件的读取和分析以及其它在各个阶段的操作;
  3. Spring上下文初始化类:在Spring工厂尚未调用刷新方法refresh之前对上下文做一些自定义操作的接口;
  4. Spring工厂读取@Configuration配置类流程:Springboot的自动配置类可以说几乎全部都是被@Configuration配置类注解的,因此Springboot的自动集成可以说是借助这个配置的读取流程来完成的,因此这方面有兴趣可以深入研究;
  5. 关联自动配置注解部分:这几个类在注解组成关系也写了,这几个类就是自动配置注解和Spring刷新流程的嵌入实现。

二、框架总体调用流程

了解Springboot的大致框架组成后,便可以将上面的几个部分用代码调用链串起来了。

1.入口类中的流程

入口类中的流程:

  1. 编码时将Springboot启动类使用SpringBootApplication注解,表明这个类是一个Bean,并且拥有EnableAutoConfiguration及SpringBootConfiguration等注解属性;
  2. 调用SpringApplicationRunListeners的environmentPrepared方法,通过监听模式调用ApplicationListener接口的实现类ConfigFileApplicationListenner类的onApplicationEvent方法,并且事件为ApplicationEnvironmentPreparedEvent,后续将会调用PropertySourceLoader接口的实现类完成yml文件和properties文件的读取分析;
  3. 调用BannerPrinter打印banner.txt自定义文件;
  4. 调用ApplicatioNContextInitializer接口的initialize接口;
  5. 调用BeanDefinitionLoader类的load接口将入口类注册进AnnotatedBeanDefinitionReader对象中。

2.Spring刷新流程

Spring刷新流程:

  1. 调用AbstractApplicationContext的refresh方法,并调用到BeanFactoryPostProcessor接口的具体实现类ConfigurationClassPostProcessor类中;
  2. 该类会进而调用ConfigurationClassParser类,在这里面进行分析@Configuration注解、@Import(对应ImportSelector接口)和@Bean等注解,并获得这些的注解类集合;
  3. 将获得的configurationClasses集合注册进Spring工厂中,并使用@EnableConfiguration-Properties注解引入类EnableConfigurationPropertiesImportSelector中获取到的Configuration-PropertiesBeanRegistrar和ConfigurationPropertiesBindingPostProcessorRegistrar两个类;
  4. 调用类ConfigurationClassBeanDefinitionReader的loadBeanDefinitions方法,调用获得的两个实现ImportBeanDefinitionRegistrar接口的类;
  5. ConfigurationPropertiesBeanRegistrar类先将所有被@ConfigurationProperteis注解的类读取并注册进Spring工厂中;
  6. 再使用ConfigurationPropertiesBindingPostProcessorRegistrar类将对应的XXXProperties类和yml文件中分析到的属性进行绑定;
  7. 后续便是Spring的一些其它操作,便不做过多的分析。
  8. 至此,Springboot自动配置和yml文件属性自动注入流程便已经完成,获得自动配置Bean和相关属性后,Spring便可以对这些已有资源进行相应的操作了。

注:SpringFactoriesLoader类是用来读取META-INF/spring.factories文件中各个属性的加载器,在入口类中将会调用这个类的loadFactories和loadFactoryNames方法来获取文件中的对应配置,以供后续使用。

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值