背景 && 可能你想干的事

  1. Spring 程序生命周期
  2. BeanDefinition 扩展点
  3. Bean的生命周期
  4. BeanFactory声明周期
  5. FactoryBean使用
  6. Spring 事件 (refresh)
  7. application.yml => Environment
  8. 各种 aware
  9. Condition

1. Spring 程序生命周期

  1. ApplicationRunner && CommandLineRunner

调用时机=>org.springframework.boot.SpringApplication#callRunners
use by spring bean

  1. SpringApplicationRunListener

use by META-INF/spring.fatories
org.springframework.boot.SpringApplicationRunListener=
com.hafiz.springbootdemo.DemoSpringApplicationRunListener

  1. ApplicationListener
  2. ApplicationContextInitializer

这货也是Spring框架原有的东西,这个类的主要作用就是在ConfigurableApplicationContext类型(或者子类型)的ApplicationContext做refresh之前,允许我们对ConfiurableApplicationContext的实例做进一步的设置和处理。

2. BeanDefinition 扩展点

BeanDefinition——spring bean的建模对象

Bean Definition Link
BeanDefinitionRegistryPostProcessor

3. Bean生命周期

BeanPostProcess
InstantiationAwareBeanPostProcessor
SmartInstantiationAwareBeanPostProcessor

ApplicationContextAwareProcessor

BeanFactoryAware
InitializingBean
init
DisposableBean

4. BeanFactory

BeanFactoryPostProcessor

5. FactoryBean

6 Spring Event

ContextRefreshedEvent
ContextStartedEvent
ContextStoppedEvent
ContextClosedEvent
RequestHandledEvent

@EventListener 注解

7. Environment相关

Environment 是什么? spring 的环境,其包含了相关配置信息,bean的属性注入来源。@Value等的来源。
相关接口 EnvironmentPostProcessor detail -> org.springframework.boot.env.EnvironmentPostProcessor
应用场景1. -> 让@EnableConfigurationProperties的值注入到@Value中

应用场景2. -> 我们引入第三方的jar(巨龙单点登录)使用的是properties配置时,我们可以集成到application.yml中。

应用场景3. -> 不单纯使用application.yml 去管理Environment 可以外部化配置拆分

应用场景4. -> hook 点, 调整Environment 源数据加载顺序。调整相关的优先级等。

8. 各种Aware

各种Aware注入 如常见的注入ApplicationContextAware 用于获取 ApplicationContext。

BeanNameAware
BeanFactoryAware
SmartInitializingSingleton

9. Condition

spring.context => 核心注解@Conditional

常见复合注解 @ConditionalOnClass@ConditionalOnPropertyConditionalOnMissingBean。 扩展Conditional => SpringBootCondition

一般最常见的是ConditionalOnMissingBean 我们就可以自定义bean,让框架使用我们的bean

spring.session.store-type=jdbc => 可以使用内存存储session

Use In Project

  1. 一般情况注册Bean
  2. 特殊情况 META-INF/spring.fatories

写在最后

以上仅仅是自己工作中总结到的一些点,Spring Boot (Spring Core) 本身扩展点就很多,如果你集成其他框架,那就更多了,所以有时间还是可以多看看源码的。

More and More