如果你已经很了解 springbooot中bean post-processor的原理和使用
,本文向你展示了一个精简版和可视化图谱;如果你很想了解它,本文提供你梯子快速的走入 bean post-processor
原理和应用。以减少你原本需要花费的时间 本文的结构为图+文本结合的方式阐述
通过本文,你能收获什么?
图中展示了 spring(boot)中post-processor
应用在 BeanDefinition转为BeanInstance再为Proxy代理类
整体的流程,包括哪个方法应用了具体的哪个post-processor,以达到什么目的或作用。
看完图中的图例后再看正图
现在,我们结合图的基础上,阐述 eanPostProcessor
的家族和使用
BeanPostProcessor
是 spring框架
中非常重要的类,每一个放到 spring ioc
中的bean的创建过程都有他的身影。俗称前置处理和后置处理,意思为在bean的创建前后可以增加自定义的处理逻辑。如,bean创建前给某个类型的bean增加一个属性值,在bean创建后生成这个bean的代理类放到spring ioc中等等
注意: BeanPostProcessor
是在 spring容器
加载了 bean的定义文件并且实例化bean之后执行的
。 BeanPostProcessor
的执行顺序是在 BeanFactoryPostProcessor
之后。关于 BeanPostProcessor vs BeanFactoryPostProcessor
,参见 BeanFactoryPostProcessory与BeanPostProcessor区别
看 BeanPostProcessor
类结构
public interface BeanPostProcessor { /** * * populate beans via marker interfaces * * 应用时机:after populate property values and before any bean * initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method) * * 应用场景:我的理解为给bean属性赋值的场景下使用 * * 如:ServletContextAwareProcessor */ @Nullable default Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { return bean; } /** * 经常用于生成proxy代理类,如应用在FactoryBean * * 应用时机:after any bean initialization callbacks (like InitializingBean's {@code afterPropertiesSet} * or a custom init-method) * 应用场景:经常用于生成proxy代理类,如应用在FactoryBean * */ @Nullable default Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { return bean; } } 复制代码
BeanPostProcessor
有个经常使用的子类型: InstantiationAwareBeanPostProcessor
,看其结构
InstantiationAwareBeanPostProcessor比BeanPostProcessor多的功能是:adds a before-instantiation callback, and a callback after instantiation but before explicit properties are set or autowiring occurs
典型的使用场景如 create proxies with special TargetSources (pooling targets, lazily initializing targets, etc), or to implement additional injection strategies such as field injection
InstantiationAwareBeanPostProcessor比BeanPostProcessor多了三个方法
public interface InstantiationAwareBeanPostProcessor extends BeanPostProcessor { /** * 应用时机:before populate property values * 应用场景:已知的场景是aop生成TargetSource的proxy代理类。todo 准确的应用 * */ @Nullable default Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException { return null; } /** * 应用时机:Perform operations after the bean has been instantiated, * but before Spring property population (from explicit properties or autowiring) occurs * * 应用场景:performing custom field injection on the given bean instance, right before Spring's autowiring kicks in */ default boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException { return true; } /** * 应用时机:postProcessAfterInstantiation之后 * 应用场景:都是直接return true */ @Nullable default PropertyValues postProcessProperties(PropertyValues pvs, Object bean, String beanName) throws BeansException { return null; } } 复制代码
从开篇的图中可看出, bean的创建(beanDefinition->beanInstance->proxy)与post-processor紧密的交织在一起
。如何正确的使用他们成为难点和关键点
Spring
中内置了很多的 BeanPostProcesso
r实现类,列举的都是我们熟悉的,他们给出了很好的使用例子,为我们使用 BeanPostProcessor
去实现我们的自己场景和应用提供了参考的姿势
BeanPostProcessor --ConfigurationPropertiesBindingPostProcessor 参数绑定相关的应用 --ConfigurationPropertiesBeans 参数绑定相关的应用 --ApplicationContextAwareProcessor 用来为bean注入ApplicationContext等容器对象 --AsyncAnnotationBeanPostProcessor @Async注解解析应用 --DataSourceInitializerPostProcessor dataSource相关应用 --BeanValidationPostProcessor bean的校验相关应用 --MethodValidationPostProcessor method的校验相关应用 --KafkaListenerAnnotationBeanPostProcessor kafka监听器的使用 --InstantiationAwareBeanPostProcessor 增加了before-instantiation和after instantiation的callback ----CommonAnnotationBeanPostProcessor:支持@Resource注解的注入 ----AutowiredAnnotationBeanPostProcessor:支持@Autowired注解的注入 ----InstantiationAwareBeanPostProcessorAdapter 对外暴露的InstantiationAwareBeanPostProcessor ----AnnotationAwareAspectJAutoProxyCreator 专门处理@AspectJ注解的 ----ImportAwareBeanPostProcessor 复制代码
由你来完成
开篇图几个 BeanPostProcessor
子类型与bean创建的交互关系,通过它你可以很明晰的了解到 post-processor
在 bean
创建的不同阶段应用的方法。相信对你了解bean的创建提供了很好的可视化 ;同时,文中详述了 BeanPostProcessor
和 InstantiationAwareBeanPostProcessor
的 BeforeInstantiation、AfterInstantiation、BeforeInitialization、AfterInitialization、postProcessProperties
方法的应用场景和应用时机,希望可以引导出合适的使用姿势 ;最后,列举了常用的 BeanPostProcessor
实现类型,简述了主要使用场景。每个 BeanPostProcessor
实现类型的详细使用希望你自己完成从而真正体会 BeanPostProcessor
的用法
一张**图片relax你的思绪