springboot post-processor應用在beanDefinition轉為beanInstance再為proxy類草錄
前提
如果你已經很瞭解springbooot中bean post-processor的原理和使用
,本文向你展示了一個精簡版和視覺化圖譜;如果你很想了解它,本文提供你梯子快速的走入bean post-processor
原理和應用。以減少你原本需要花費的時間
本文的結構為圖+文字結合的方式闡述
知識點收穫
通過本文,你能收穫什麼?
- BeanPostProcessor作用
- BeanPostProcessor中其每個方法的應用場景
- BeanPostProcessor家族成員
- BeanPostProcessor型別物件在spring ioc時的應用
圖中展示了spring(boot)中post-processor
BeanDefinition轉為BeanInstance再為Proxy代理類
整體的流程,包括哪個方法應用了具體的哪個post-processor,以達到什麼目的或作用。
看完圖中的圖例後再看正圖
正文
現在,我們結合圖的基礎上,闡述eanPostProcessor
的家族和使用
BeanPostProcessor作用
BeanPostProcessor
是spring框架
中非常重要的類,每一個放到spring ioc
中的bean的建立過程都有他的身影。俗稱前置處理和後置處理,意思為在bean的建立前後可以增加自定義的處理邏輯。如,bean建立前給某個型別的bean增加一個屬性值,在bean建立後生成這個bean的代理類放到spring ioc中等等
注意: BeanPostProcessor
是在spring容器
載入了bean的定義檔案並且例項化bean之後執行的
。 BeanPostProcessor
的執行順序是在BeanFactoryPostProcessor
之後。關於BeanPostProcessor vs BeanFactoryPostProcessor
,參見BeanFactoryPostProcessory與BeanPostProcessor區別
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緊密的交織在一起
。如何正確的使用他們成為難點和關鍵點
BeanPostProcessor家族成員
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
複製程式碼
典型的應用示例
AutowiredAnnotationBeanPostProcessor
由你來完成
it`s time to summary
開篇圖幾個BeanPostProcessor
子型別與bean建立的互動關係,通過它你可以很明晰的瞭解到post-processor
在bean
建立的不同階段應用的方法。相信對你瞭解bean的建立提供了很好的視覺化
;同時,文中詳述了BeanPostProcessor
和InstantiationAwareBeanPostProcessor
的BeforeInstantiation、AfterInstantiation、BeforeInitialization、AfterInitialization、postProcessProperties
方法的應用場景和應用時機,希望可以引匯出合適的使用姿勢
;最後,列舉了常用的BeanPostProcessor
實現型別,簡述了主要使用場景。每個BeanPostProcessor
實現型別的詳細使用希望你自己完成從而真正體會BeanPostProcessor
的用法
一張**圖片relax你的思緒