1. 程式人生 > 程式設計 >springboot post-processor應用在beanDefinition轉為beanInstance再為proxy類草錄

springboot post-processor應用在beanDefinition轉為beanInstance再為proxy類草錄

前提

如果你已經很瞭解springbooot中bean post-processor的原理和使用,本文向你展示了一個精簡版和視覺化圖譜;如果你很想了解它,本文提供你梯子快速的走入bean post-processor原理和應用。以減少你原本需要花費的時間 本文的結構為圖+文字結合的方式闡述

知識點收穫

通過本文,你能收穫什麼?

  1. BeanPostProcessor作用
  2. BeanPostProcessor中其每個方法的應用場景
  3. BeanPostProcessor家族成員
  4. BeanPostProcessor型別物件在spring ioc時的應用

圖中展示了spring(boot)中post-processor

應用在BeanDefinition轉為BeanInstance再為Proxy代理類整體的流程,包括哪個方法應用了具體的哪個post-processor,以達到什麼目的或作用。

看完圖中的圖例後再看正圖

springboot post-processor應用在 BeanDefinition轉為BeanInstance再為Proxy代理類.png

正文

現在,我們結合圖的基礎上,闡述eanPostProcessor的家族和使用

BeanPostProcessor作用

BeanPostProcessorspring框架中非常重要的類,每一個放到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家族成員

20191201203038.png

Spring中內建了很多的BeanPostProcessor實現類,列舉的都是我們熟悉的,他們給出了很好的使用例子,為我們使用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-processorbean建立的不同階段應用的方法。相信對你瞭解bean的建立提供了很好的視覺化 ;同時,文中詳述了BeanPostProcessorInstantiationAwareBeanPostProcessorBeforeInstantiation、AfterInstantiation、BeforeInitialization、AfterInitialization、postProcessProperties方法的應用場景和應用時機,希望可以引匯出合適的使用姿勢 ;最後,列舉了常用的BeanPostProcessor實現型別,簡述了主要使用場景。每個BeanPostProcessor實現型別的詳細使用希望你自己完成從而真正體會BeanPostProcessor的用法

一張**圖片relax你的思緒