spring擴展點總結


看spring源碼,搞明白流程,最終還是要知道spring中有哪些可以擴展的地方。流程是死的,擴展點是活的,在不修改源碼的前提下,只有搞明白spring有哪些擴展點,才能根據需求靈活的完成編碼工作。

BeanFactory構造階段

有一個NamespaceHandler可擴展的地方。

NamespaceHandler

通過自定義的NamespaceHandler,配合BeanDefinitionParser,可以完成自定義Bean的組裝操作,對於BeanDefinition的數據結構,進行個性化創建。

紅線處是MyBatis的NamespaceHandler,和原始的接口名重了而已。(MyBatis的Mapper接口BeanDefination掃描,還可以使用MapperScannerConfigurer,在BeanFactoryPostProcessor執行中、Bean實例化前實現)

Dubbo在spring中的使用,就有NamespaceHandler的身影。

還有目前常用的component-scan,也是利用ComponentScanBeanDefinitionParser完成了指定包下所有類的掃描,BeanDefinition創建的過程。

ApplicationContext構造階段

有兩個可擴展的地方:BeanFactoryPostProcessor,BeanPostProcessor。

BeanFactoryPostProcessor

擁有一個接口方法:

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException;

實現BeanFactoryPostProcessor的Bean,ApplicationContext會提前實例化,並使用BeanFactoryPostProcessor對BeanFactory中的BeanDefinition進行變化修改,或者創建BeanDefinition到BeanFactory中。

 

比如PropertyPlaceholderConfigurer可將property-placeholder中的配置文件信息替換到BeanDefinition中。

比如ConfigurationClassPostProcessor發現BeanFactory中使用了@Configuration注解的Bean,並根據此Bean在BeanFactory中增加Bean。

比如MyBatis中使用的MapperScannerConfigurer,掃描basePackage配置下的接口,生成多個Bean並注冊到BeanFactory中。

BeanPostProcessor

擁有兩個接口方法:

Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;

分別在Bean實例初始化之前和之后執行,可自定義修改Bean實例,甚至替換Bean實例為自定義實例。

此外還有四個接口繼承了BeanPostProcessor接口。

DestructionAwareBeanPostProcessor

接口有一個方法,在實例銷毀前使用。

InstantiationAwareBeanPostProcessor

接口有三個方法,兩個在實例創建前后(不是初始化前后)使用,一個是在populateBean變量注入時使用。

Object postProcessBeforeInstantiation(Class<?> beanClass, String beanName) throws BeansException;
boolean postProcessAfterInstantiation(Object bean, String beanName) throws BeansException;
PropertyValues postProcessPropertyValues(PropertyValues pvs, PropertyDescriptor[] pds, Object bean, String beanName) throws BeansException;
  • 其中實例創建前后使用的接口,可檢查是否已使用AOP代理創建了實例。並返回創建的實例,之后的Bean實例創建步驟便不會繼續執行了。
  • 變量注入使用的接口,可實現@Autowired注解的注入。

注:常見的AbstractAutoProxyCreator真正產生代理實例的地方是在postProcessAfterInitialization中,AOP也是通過此種方式和IOC過程連接起來的。http://www.ithao123.cn/content-6051885.html

SmartInstantiationAwareBeanPostProcessor

接口有三個方法,在實例創建前智能判斷實例類型,智能判斷構造函數,獲取預創建實例,防止循環依賴。

實現了InstantiationAwareBeanPostProcessor接口的類,基本都實現了SmartInstantiationAwareBeanPostProcessor接口。

MergedBeanDefinitionPostProcessor

接口有一個方法,在實例創建前,修改合並BeanDefinition。

看了一下幾個實現類,除了調用BeanDefinition.registerExternallyManagedDestroyMethod方法外,沒有修改過BeanDefinition的其他內容。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM