背景 && 可能你想干的事
- Spring 程序生命周期
- BeanDefinition 扩展点
- Bean的生命周期
- BeanFactory声明周期
- FactoryBean使用
- Spring 事件 (refresh)
- application.yml => Environment
- 各种 aware
- Condition
1. Spring 程序生命周期
ApplicationRunner
&&CommandLineRunner
调用时机=>
org.springframework.boot.SpringApplication#callRunners
use by spring bean
SpringApplicationRunListener
use by META-INF/spring.fatories
org.springframework.boot.SpringApplicationRunListener=
com.hafiz.springbootdemo.DemoSpringApplicationRunListener
ApplicationListener
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
、 @ConditionalOnProperty
、ConditionalOnMissingBean
。 扩展Conditional => SpringBootCondition
一般最常见的是ConditionalOnMissingBean
我们就可以自定义bean,让框架使用我们的bean
如 spring.session.store-type=jdbc
=> 可以使用内存存储session
Use In Project
- 一般情况注册Bean
- 特殊情况 META-INF/spring.fatories
写在最后
以上仅仅是自己工作中总结到的一些点,Spring Boot (Spring Core) 本身扩展点就很多,如果你集成其他框架,那就更多了,所以有时间还是可以多看看源码的。