type
status
date
slug
summary
tags
category
icon
password
😀
这里写文章的前言: 一个简单的开头,简述这篇文章讨论的问题、目标、人物、背景是什么?并简述你给出的答案。
可以说说你的故事:阻碍、努力、结果成果,意外与转折。
 

📝 SpringBoot中BeanPostProcessor

BeanPostProcessor 是在Spring中实例化bean的时候使用到的,也是对bean的一种扩展. 理解好 BeanPostProcessor是对理解好 bean 的初始化是很重要的. 每种BeanPostProcessor都有各自不同的用途.
看下 BeanPostProcessor 这个接口,是只有 postProcessBeforeInitialization 和 postProcessAfterInitialization 这二种方法的,并且都是用 default来进行修饰,也就是实现这个接口的时候,可以实现其方法,也可以不用实现其方法的,这就是接口上的方法使用 default 来进行修饰的情况.
ApplicationContextAwareProcessor
WebApplicationContextServletContextAwareProcessor
ConfigurationClassPostProcessor.ImportAwareBeanPostProcessor (内部类)
PostProcessorRegistrationDelegate.BeanPostProcessorChecker(内部类)
ConfigurationPropertiesBindingPostProcessor
WebServerFactoryCustomizerBeanPostProcessor
ErrorPageRegistrarBeanPostProcessor
CommonAnnotationBeanPostProcessor
AutowiredAnnotationBeanPostProcessor
ApplicationListenerDetector
如果没有对 SpringBoot 中的beanPostProcessor 进行扩展什么的话, 那么当你创建bean的时候,应该是十个的样子(当然了,这是基于目前的版本的).
如果你看看这十个 beanPostProcessor,其中有的是直接继承 BeanPostProcessor, 有的是 集成其BeanPostProceesor的子类,但是最顶层的话,就是BeanPostProcessor. 需要结合 doCreateBean这个方法一起看了,当其创建一个 bean 的时候, 是怎么使用这些 beanPostProcessor进行扩展的.

beanPostProcessor 添加

AbstractBeanFactory#beanPostProcessors 可以看到beanFactory中的beanPostProcessors属性字段,该字段就是对BeanPostProcessor进行存储的集合.
在 refresh() 方法中进行添加 beanPostProcessor进来的 可以看到主要添加 beanPostProcessor进来的地方是 registerBeanPostProcessors 方法. 可以看到这里是添加了 十二个.
  • 走完 prepareBeanFactory方法: 添加了 ApplicationContextAwareProceesor和ApplicationListenerDetector
  • postProcessBeanFactory 走完 : 添加 WebApplicationContextServletContextAwareProceesor
  • invokeBeanFactoryPostProcessors 走完: 添加 ConfigurationClassPostProcessor$ImportAwareBeanPostProcessor 进来
  • registerBeanPostProcessors 走完 : PostProcessorRegisrationDelegate$BeanPostProceesorChecker/ConfigurationPropertiesBindingPostProcessor/AsyncAnnotationBeanPostProcessor/WebServerFactoryCustomizerBeanPostProcessor/ErrorPageRegistrarBeanPostProcessor/CommonAnnotationBeanPostProcessor/ScheduleAnnotationBeanPostProcessor/ApplicationListenerDetector
 

ApplicationContextAwareProcessor

该Processor的针对性还是比较强的,主要就是处理 EnvironmentAware/EmbeddedValueResolverAware/ResourceLoaderAware/ApplicationEventPublisherAware/MessageSourceAware/ApplicationContextAware 这几种情况的
 

WebApplicationContextServletContextAwareProcessor

该类继承了org.springframework.web.context.support.ServletContextAwareProcessor,先看其父类重写PostProcessor的方法.
可以看到这个 Processor 主要就是处理 web 环境的. 也就是在有web环境的情况下, 对 bean 是 ServletContextAware和ServletConfigAware的进行处理.
 

ImportAwareBeanPostProcessor

ImportAwareBeanPostProcessor --> InstantiationAwareBeanPostProcessorAdapter --> SmartInstantiationAwareBeanPostProcessor ---> SmartInstantiationAwareBeanPostProcessor --> InstantiationAwareBeanPostProcessor ---> BeanPostProcessor
可以看到, 该 BeanPostProcessor 其上面的接口和类还是蛮多的. 从该 postProcessor的名字上看,其要做的功能还是很好晓得的,那就是做关于 @Import 这些相关的.
TODO : 后续 debug 进行跟进看
 

BeanPostProcessorChecker

该 PostProcessor 是直接继承 BeanPostProcessor 的, 所以看这二个重写的方法即可.
可以看到该 BeanPostProcessor是对初始化完了后进行检查,如果满足条件的话,就会打印一句log出来. log里面的主要内容就是,不符合自动代理的条件.
 

ConfigurationPropertiesBindingPostProcessor

该PostProcessor是直接实现了BeanPostProcessor 接口的, 但是该类也实现了ApplicationContextAware和InitializingBean这二个方法的. ApplicationContextAware 是提供application的, InitializingBean 方法是在初始完该bean后,调用afterPropertiesSet进行回调的
 

WebServerFactoryCustomizerBeanPostProcessor

该 PostProcessor 是有实现 BeanFactoryAware 的,实现该接口是可以获取到 beanFactory的. 然后 赋值给其自身的参数. 也就是说该类是有一个 beanFactory的.
可以看到该 postProcessor 主要处理 bean 是 WebServerFactory的
 

ErrorPageRegistrarBeanPostProcessor

该 PostProcessor 也是实现了 BeanFactoryAware 接口的,所以其内部也是有一个 ListableBeanFactory 的.
可以看到该 PostProcessor 主要就是 设置 ErrorPage 的.
 

CommonAnnotationBeanPostProcessor

该类继承了 InitDestroyAnnotationBeanPostProcessor , 实现了InstantiationAwareBeanPostProcessor/BeanFactoryAware 接口,
实现了 BeanFactoryAware 接口,就是相当于获取到了 beanFactory,可以看到下面的setBeanFactory方法.
该PostProcessor 主要是处理一些 @Resource注解,其父类处理@PostConstruct和@PreDestroy注解修饰的方法.
其父类 InitDestroyAnnotationBeanPostProcessor
 

AutowiredAnnotationBeanPostProcessor

 

ApplicationListenerDetector

可以看到该类自己内部维护了一个 application 和 singletonNames(集合) 的.
该BeanPostProcess 可以看到初始完后调用的回调方法,根据beanName获取出true的哈,就往application中添加ApplicationListener进来.
销毁之前,也是对application中ApplicationListener进行remove
 

🤗 总结归纳

除了SpringBoot中没有做任何配置中有的这些之外,肯定是还有很多其他的.
当你在debug的时候,你会发现,有一些 processor 在初始化之前的名字 : 比如:org.springframework.context.annotation.internalAutowiredAnnotationProcessor ,其实它就是一个AutowiredAnnotationProcessor才是正确的,但是该名字前面却是有 internal 这个单词的,也就是内部的意思. 所以从名字上看,还是可以通过名字进行初始化区分的.

📎 参考文章

 
💡
有关文章的问题,欢迎您在底部评论区留言,一起交流~