spring中幾個比較重要的擴展點


BeanFactoryPostProcessor

實現該接口,可以在spring的bean創建之前,修改bean的定義屬性。也就是說,Spring允許BeanFactoryPostProcessor在容器實例化任何其它bean之前讀取配置元數據,並可以根據需要進行修改,例如可以把bean的scope從singleton改為prototype,也可以把property的值給修改掉。可以同時配置多個BeanFactoryPostProcessor,並通過設置'order'屬性來控制各個BeanFactoryPostProcessor的執行次序。

注意:BeanFactoryPostProcessor是在spring容器加載了bean的定義文件之后,在bean實例化之前執行的。

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);

 

————————————————

原文鏈接:https://blog.csdn.net/caihaijiang/java/article/details/35552859

 

Spring內部也是在這塊對@Configuration配置類實現CGLIB代理的(ConfigurationClassPostProcessor#postProcessBeanFactory)

BeanDefinitionRegistryPostProcessor

該接口繼承了BeanFactoryPostProcessor 接口。在所有bean定義信息將要被加載,bean實例還未創建的時候執行我們的擴展;從spring源碼看它優先於BeanFactoryPostProcessor執行(先遍歷了BeanDefinitionRegistryPostProcessor);利用BeanDefinitionRegistryPostProcessor給容器中再額外添加一些組件。

 

Spring內部也是基於它實現的bean掃描注冊。

 

BeanFactoryPostProcessor可以修改各個Bean定義(BeanDefinition),BeanDefinitionRegistryPostProcessor可以動態地注冊Bean。

 

如下兩個方法:

void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);


void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) ;
BeanPostProcessor

BeanPostProcessor,可以在spring容器實例化bean之后,在執行bean的初始化方法前后,添加一些自己的處理邏輯。這里說的初始化方法,指的是下面兩種:

1)bean實現了InitializingBean接口,對應的方法為afterPropertiesSet

2)在bean定義的時候,通過init-method設置的方法

 

注意:BeanPostProcessor是在spring容器加載了bean的定義文件並且實例化bean之后執行的。BeanPostProcessor的執行順序是在BeanFactoryPostProcessor之后。

————————————————

原文鏈接:https://blog.csdn.net/caihaijiang/java/article/details/35552859

 

ImportSelector

ImportSelector類只能通過@Import的方式來加載,通常是啟動類或配置類。

ImportSelector接口提供了一個selectImports方法,該方法將返回一個數組,也就是類實例名稱。spring會把根據這些類名稱創建bean定義,由於這個過程是spring內部幫我們做的,所以我們無法干涉這個bean定義的創建注冊。

具體應用可參見:https://www.cnblogs.com/tianboblog/p/12619262.html

String[] selectImports(AnnotationMetadata importingClassMetadata);
ImportBeanDefinitionRegistrar

ImportBeanDefinitionRegistrar類只能通過其他類@Import的方式來加載,通常是啟動類或配置類。

其中比較典型的應用就是mybatis.spring中實現的@MapperScan注解。

詳見:https://www.cnblogs.com/tianboblog/p/12618057.html

void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {}

它相對於ImportSelector功能更強大,提供了registry,直接可以通過它進行bean注冊。


免責聲明!

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



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