Springboot中有哪些扩展点以及其应用场景
最后我们用“Springboot中有哪些扩展点”这个话题来回顾一下Springboot的内容。SpringBoot和Spring中提供了很多扩展点,给开发者一个很大的灵活空间,按照启动的调用顺序,大概有如下扩展点。
-
ApplicationContextInitializer
Springboot中默认有以下实现,通常用于需要对应用程序上下文进行编程初始化的web应用程序中。例如,根据上下文环境注册属性源或激活配置文件等。在SpringApplication#applyInitializers方法中,会调用所有的ApplicationContextInitializer#initialize方法:
-
BeanDefinitionRegistryPostProcessor
顾名思义,就是BeanDefinition的后置处理器,AbstractApplicationContext#refresh方法中,会调用invokeBeanFactoryPostProcessors(beanFactory),最终会调用PostProcessorRegistrationDelegate#invokeBeanDefinitionRegistryPostProcessors
这个方法可以我们实现自定义bean并注册到BeanDefinitionRegistry,如上图可以看到MapperScannerConfigurer,Mybatis也是自己定义bean并注册的,我们也可以自定义bean并注册: -
BeanFactoryPostProcessor
顾名思义,就是BeanFactory的后置处理器,Spring IoC容器允许BeanFactoryPostProcessor在容器实例化任何bean之前读取bean的定义(配置元数据),并可以修改它。 -
SmartInstantiationAwareBeanPostProcessor
在Bean实例化前,AbstractAutowireCapableBeanFactory#createBeanInstance的时候,来决定实用bean的哪个构造函数,好像循环依赖也实用了这个后置处理器来提前暴露bean 的早期引用。 -
InstantiationAwareBeanPostProcessor
AbstractAutowireCapableBeanFactory#createBean方法中会调用resolveBeforeInstantiation:
在InstantiationAwareBeanPostProcessor的接口中,主要有如下几个方法:
postProcessBeforeInstantiation:自身方法,是最先执行的方法,它在目标对象实例化之前调用,该方法的返回值类型是Object,我们可以返回任何类型的值。由于这个时候目标对象还未实例化,所以这个返回值可以用来代替原本该生成的目标对象的实例(比如代理对象)。如果该方法的返回值代替原本该生成的目标对象,后续只有postProcessAfterInitialization方法会调用,其它方法不再调用;否则按照正常的流程走
postProcessAfterInstantiation:在目标对象实例化之后调用,这个时候对象已经被实例化,但是该实例的属性还未被设置,都是null
postProcessPropertyValues:对属性值进行修改,如果postProcessAfterInstantiation方法返回false,该方法可能不会被调用。可以在该方法内对属性值进行修改
postProcessBeforeInitialization:在Bean的自定义初始化方法之前执行
postProcessAfterInitialization:在Bean的自定义初始化方法执行完成之后执行 -
BeanFactoryAware
在这里,Bean已经初始化完成,beanFactory让你可以不依赖注入方式,随意的读取IOC容器里面的对象 -
BeanNameAware
实在不知道这个接口有什么用 -
ApplicationContextAwareProcessor
这个是在Tomcat启动完成后调用finishBeanFactoryInitialization方法时触发的:
该类本身并不是直接的扩展点,但是该类内部有6个可以被实现的扩展点:EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware(作用和BeanFactoryAware类似) -
InitializingBean
spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用。InitializingBean的作用时机在于,对象创建并将所有的属性设置完成后,进行初始化,其初始化方法就是afterPropertiesSet方法。 -
FactoryBean
作用是在IOC容器中创建复杂的Bean,如org.mybatis.spring.SqlSessionFactoryBean -
SmartInitializingSingleton
在SpringApplication#refreshContext(context)中调用,是当所有单例 bean 都初始化完成以后调用的,主要应用场合就是在所有单例 bean 创建完成之后,可以在该回调中做一些事情,如EventListenerMethodProcessor: -
CommandLineRunner
如果想要在SpringApplication启动后做一些事情,我们可以实现CommandLineRunner或者ApplicationRunner接口。这2个接口都提供了一个run方法,这个run方法会在SpringApplication.run(…)完成之前被调用,如JobLauncherCommandLineRunner。
更多了解请关注一米源码公众号并回复SpringBoot或https://itproject-manager.com/
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
· 为什么说在企业级应用开发中,后端往往是效率杀手?
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 推荐几款开源且免费的 .NET MAUI 组件库
· 实操Deepseek接入个人知识库
· 易语言 —— 开山篇
· Trae初体验