BeanPostProcessor是个什么?

157 阅读1分钟

两个重要的方法:

初始化前:postProcessBeforeInitialization

初始化后:postProcessAfterInitialization

子接口

InstantiationAwareBeanPostProcessor

实例化前:postProcessBeforeInstantiation
实例化后:postProcessAfterInstantiation
属性赋值处理:postProcessProperties

SmartInstantiationAwareBeanPostProcessor

预测bean的类型:predictBeanType
确定要为给定bean使用的候选构造函数:determineCandidateConstructors
获取对指定bean的早期访问的引用,通常用于解决循环引用:getEarlyBeanReference

MergedBeanDefinitionPostProcessor

合并BeanDefinition的后置处理:postProcessMergedBeanDefinition
重置BeanDefinition:resetBeanDefinition

实现类

AutowiredAnnotationBeanPostProcessor

作用:解析Autowired、Value、javax.inject.Inject三个注解

实现了以下方法

postProcessMergedBeanDefinition
resetBeanDefinition
determineCandidateConstructors
postProcessProperties

从createApplicationContext()开始,创建上下文对象时,通过反射执行AnnotationConfigServletWebServerApplicationContext的构造函数时,调用AnnotatedBeanDefinitionReader的构造函数,调用了AnnotationConfigUtils.registerAnnotationConfigProcessors

通过registerAnnotationConfigProcessors方法注册到beanFactory中

ConfigurationClassPostProcessor
AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
EventListenerMethodProcessor
DefaultEventListenerFactory
PersistenceAnnotationBeanPostProcessor

从refresh开始,通过registerBeanPostProcessors方法,调用PostProcessorRegistrationDelegate.registerBeanPostProcessors,通过beanFactory.addBeanPostProcessor将其添加到beanPostProcessors中

依赖查找bean时 beanFactory.getBean-->doGetBean-->getSingleton-->singletonFactory.getObject()-->createBean-->doCreateBean-->createBeanInstance-->determineConstructorsFromBeanPostProcessors

在填充属性时,populateBean,执行postProcessProperties方法,进行inject,解析依赖beanFactory.resolveDependency,又重新依赖查找getBean

总结一下,BeanPostProcessor是个什么呢?就是在bean的生命周期中的一个处理器,AutowiredAnnotationBeanPostProcessor是负责解析标注Autowired等注解bean,在属性赋值时,通过依赖注入找到bean继续加载。