SpringBoot — 启动原理总结

小龙 1,334 2022-07-14

Web应用类型判断

SpringBoot 会根据 classpath 下存在的类,决定当前应用的类型,以此来创建适合的 IOC 容器。

默认 WebMvc 情况下,创建的 IOC 容器是:AnnotationConfigServletWebServerApplicationContext

Spring 的 SPI 技术

SpringBoot 使用 SpringFactoriesLoader.loadFactoryNames 机制来从 META-INF/spring.factories 文件中读取指定 类/注解 映射的组件全限定类名,以此来反射创建组件。Spring设计的 SPI 比 Java 原生的 SPI 更加的灵活,因为它的 key 可以指定任意 类/注解,不再局限于 “接口 - 实现类” 的形式

SpringApplicationRunListener

SpringApplicationRunListener 可以监听 SpringApplication 的运行方法。通过注册 ApringApplicationRunListener,可以自定义在 SpringBoot 应用启动过程、运行、销毁时监听对应的事件,来执行自定义逻辑。

Environment

Spring 应用的 IOC 容器需要依赖 Environment(运行环境),它用来表示 Spring 应用运行时的环境,它分为 profilesproperties 两个部分。通过配置不同的 profile ,可以支持配置的灵活切换,并且可以同时配置一个到多个 profile 来共同配置 Environment 。

多种后置处理器

IOC 容器中出现的后置处理器类型非常的多:

  • BeanPostProcessor:Bean 实例化后、初始化前后的触发
  • BeanDefinitionRegistryPostProcessor:所有 Bean 的定义信息即将被加载但未实例化时触发
  • BeanFactoryPostProcessor:所有的 BeanDefinition 已经被加载,但没有 Bean 被实例化时触发
  • InitDestoryAnnotationBeanPostProcessor:触发执行 Bean 中标注 @PostConstruct、@PreDestory 注解的方法
  • ConfigurationClassPostProcessor:解析加了 @Configuration 的配置类,解析 @ComponentScan 注解扫描的包,以及解析 @Import、@ImportResource 等注解
  • AutowiredAnnotationBeanPostProcessor:负责处理 @Autowired、@Value 等注解

监听器与观察者模式

SpringFramework 有原生的 AnnotationListener,在 IOC 容器中有对应的监听器注册,与事件广播器。通过不同的 ApplicationListener,并指定事件类型,注册到 IOC 容器中,IOC 容器会自动将其注册并在事件发布是执行监听方法

初始化单实例 Bean 与循环依赖

Bean 的初始化经过的步骤非常的多,其中包括 AOP 的部分。其中 IOC 容器为了避免出现循环依赖,会在 BeanFactory 中设计三级缓存来解决 Setter 和 @Autowired 的循环依赖

嵌入式 Web 容器的创建

SpringBoot 扩展的 SerlvetWebServerApplicationContext 会在 IOC 容器的模板方法 onRefresh 方法中创建嵌入式 Web 容器。


# IOC