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 应用运行时的环境,它分为 profiles 和 properties 两个部分。通过配置不同的 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 容器。