专注于 JetBrains IDEA 全家桶,永久激活,教程
持续更新 PyCharm,IDEA,WebStorm,PhpStorm,DataGrip,RubyMine,CLion,AppCode 永久激活教程

Spring 源码之 强大的后置处理器

BeanPostProcessor 是什么,有什么作用,为什么要知道它

spring的扩展点之一,bean后置处理器,在spring管理bean的过程中,这些后置处理器 可以干预bean的实例化前后,初始化前后,如果知道并且熟悉它,就可以干扰spring对这些bean的实例化,初始化,对spring进行扩展。 在spring对bean的实例化,初始化,这些后置处理器无处不在

1.InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

调用链:

AbstractAutowireCapableBeanFactory#createBean->
AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation->
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation->
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation

作用

如果返回不为空的对象,就直接返回给spring容器,不走下面的容器,我们可以利用这个扩展点,对bean进行包装,代理,让这个bean完成特定的功能 如果这个扩展点真的返回不为空的对象之后还会调用BeanPostProcessor#postProcessAfterInitialization 对bean进行初始化。

2.SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors

调用链

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#createBeanInstance->
AbstractAutowireCapableBeanFactory#determineConstructorsFromBeanPostProcessors->
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors

作用

判断对象实例化的时候要选哪个构造方法,比如有一个无参构造,一个有参怎么选 一个没有注解,一个注解@Autowire或者@value

3.MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

调用链

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#applyMergedBeanDefinitionPostProcessors->
MergedBeanDefinitionPostProcessor#postProcessMergedBeanDefinition

作用

在填充bean属性之前,先把需要填充的属性缓存下来,或者在bean初始化之前,先把初始化的信息缓存下来,dubbo就是扩展了这个后置处理器,所以如果在类上@reference 就可以被自动注入,AnnotationInjectedBeanPostProcessor 这个是dubbo进行扩展实现类

4.SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

调用链

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#getEarlyBeanReference->
SmartInstantiationAwareBeanPostProcessor#getEarlyBeanReference

作用

spring aop 有用到,会判断是否需要加入切面增强,也就需不需要被aop代理,如果不需要就放到一个map里面,后面的流程有用到(这个一知半解,还需要去看源码)

5.InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

调用链

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#populateBean->
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation

作用

这个后置处理器的方法顾名思义,就是在bean实例化之后做的事情,做了什么事情,判断这个bean是否需要填充属性,如果需要就往下走填充属性的流程,如果不需要就return。其实看了spring的实现类,基本都是需要填充属性的

6.InstantiationAwareBeanPostProcessor#postProcessProperties #postProcessPropertyValues

调用链

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#populateBean->
InstantiationAwareBeanPostProcessor#postProcessProperties
或者 InstantiationAwareBeanPostProcessor#postProcessPropertyValues

作用

填充bean的属性,比如 AutowiredAnnotationBeanPostProcessor 这个后置处理器解析了 @Autowire @value @Inject 这几个注解。 CommonAnnotationBeanPostProcessor 这个后置处理器解析 @Resource 这个注解,完成依赖注入

7.BeanPostProcessor#postProcessBeforeInitialization

调用链

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#initializeBean->
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInitialization->
BeanPostProcessor#postProcessBeforeInitialization

作用

postProcessBeforeInitialization 这个后置处理器的方法,顾名思义就是在bean初始化的之前执行。 像springboot 这个类 ConfigurationPropertiesBindingPostProcessor 功能就很强大,实现了springboot 自动配置的作用,可以将springboot的配置,比如application.yml文件中的配置自动绑定到java配置类,实现自动配置。 InitDestroyAnnotationBeanPostProcessor 这个类会去执行bean的初始化方法 标有@PostConstruct 方法。

8.BeanPostProcessor#postProcessBeforeInitialization

调用链 BeanPostProcessor#postProcessAfterInitialization

AbstractAutowireCapableBeanFactory#doCreateBean->
AbstractAutowireCapableBeanFactory#initializeBean->
AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization->
BeanPostProcessor#postProcessAfterInitialization

作用

postProcessAfterInitialization 这个后置处理器的方法,顾名思义就是在bean初始化的之后执行。AbstractAutoProxyCreator,如果bean需要aop,这个会完成aop的织入,对bean进行代理,生成代理类((jdk代理或者cglib代理)

文章永久链接:https://tech.souyunku.com/26707

未经允许不得转载:搜云库技术团队 » Spring 源码之 强大的后置处理器

JetBrains 全家桶,激活、破解、教程

提供 JetBrains 全家桶激活码、注册码、破解补丁下载及详细激活教程,支持 IntelliJ IDEA、PyCharm、WebStorm 等工具的永久激活。无论是破解教程,还是最新激活码,均可免费获得,帮助开发者解决常见激活问题,确保轻松破解并快速使用 JetBrains 软件。获取免费的破解补丁和激活码,快速解决激活难题,全面覆盖 2024/2025 版本!

联系我们联系我们