【Spring】Spring後置處理器
Spring經過XML解析獲取到了所有需要例項化Bean的資訊並讀取到BeanDefinition後,就儲存在了BeanDefinitionMap容器中。在例項化bean的操作就是依據這些BeanDefinition定義來做,而在例項化之前,Spring允許我們通過自定義擴充套件來改變bean的定義。定義一旦變了,後面的例項也就變了。而beanFactory後置處理器,既BeanFactoryPostProcessor就是用來改變bean定義的。
invokeBeanFactoryPostProcessors(beanFactory)
// 建立BeanFactory,並且把定義的Bean的資訊讀取到了BeanDefinition中
invokeBeanFactoryPostProcessors(beanFactory);
// BeanDefinitionRegistryPostProcessor 和 BeanFactoryPostProcessor介面的呼叫
ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
在載入完BeanDefinition後緊接著就會執行obtainFreshBeanFactory,幫我們呼叫實現了BeanFactoryPostProcessor和BeanDefinitionRegistryPostProcessor介面的方法。
BeanDefinitionRegistryPostProcessor繼承了BeanFactoryPostProcessor介面,所以它們一共有兩個核心的方法:
@Component
public class WintigBeanDefinitionRegistryPostProcessor implements BeanDefinitionRegistryPostProcessor {
/**
* 在例項化之前,可以對BeanDefinition進行修改和註冊
* @param registry the bean definition registry used by the application context
* @throws BeansException
*/
@Override
public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
// 獲取所有beanDefinitionNames
String[] beanDefinitionNames = registry.getBeanDefinitionNames();
for (String beanDefinitionName : beanDefinitionNames) {
// 根據name獲取beanDefinition
BeanDefinition beanDefinition = registry.getBeanDefinition(beanDefinitionName);
}
// 新增beanDefinition
GenericBeanDefinition genericBeanDefinition = new GenericBeanDefinition();
genericBeanDefinition.setBeanClass(GenericBeanDefinitionBean.class);
// 屬性設定
MutablePropertyValues propertyValues = genericBeanDefinition.getPropertyValues();
propertyValues.add("name", "wintig");
registry.registerBeanDefinition("genericBeanDefinitionBean", genericBeanDefinition);
// 刪除指定beanDefinition
registry.removeBeanDefinition("genericBeanDefinitionBean");
// 自定義掃描器
// 就完成了"com.wintig"路徑下,有WintigService註解類的掃描
ClassPathBeanDefinitionScanner scanner = new ClassPathBeanDefinitionScanner(registry);
scanner.addIncludeFilter(new AnnotationTypeFilter(WintigService.class));
scanner.scan("com.wintig");
}
/**
* 拿到beanFactory容器,你可以根據業務進行擴充套件
* @param beanFactory the bean factory used by the application context
* @throws BeansException
*/
@Override
public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
DefaultListableBeanFactory listableBeanFactory = (DefaultListableBeanFactory)beanFactory;
// 允許使用相同名稱重新註冊不同的bean實現
listableBeanFactory.setAllowBeanDefinitionOverriding(true);
// 允許迴圈依賴
listableBeanFactory.setAllowCircularReferences(true);
}
public class GenericBeanDefinitionBean {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
相關文章
- Spring之後置處理器Spring
- Spring原始碼之BeanFactoryPostProcessor(後置處理器)Spring原始碼Bean
- 【spring原始碼】七、後置處理器BeanPostProcessorSpring原始碼Bean
- Spring 高階特性之二:後置處理器PostProcessor深入理解Spring
- BeanPostProcessor 後置處理器Bean
- Spring Ioc原始碼分析系列--Ioc容器註冊BeanPostProcessor後置處理器以及事件訊息處理Spring原始碼Bean事件
- JMeter—後置處理器(十)JMeter
- 【Spring註解驅動開發】關於BeanPostProcessor後置處理器,你瞭解多少?SpringBean
- 2.3 spring5原始碼系列---內建的後置處理器PostProcess載入原始碼Spring原始碼
- 5.8.2 jmeter元件-後置處理器-XPath提取器JMeter元件
- Spring 泛型處理Spring泛型
- Spring系列(七) Spring MVC 異常處理SpringMVC
- Spring Boot 之 Spring Batch 批處理實踐Spring BootBAT
- Spring Boot 異常處理Spring Boot
- Spring處理@Configuration的分析Spring
- 《Spring Batch 權威指南》之“批處理和 Spring”SpringBAT
- Spring boot/Spring 統一錯誤處理方案的使用Spring Boot
- Spring Boot整合Spring Cloud Task實現批處理操作Spring BootCloud
- Spring是如何處理註解的Spring
- spring boot 統一異常處理Spring Boot
- 深入理解Spring異常處理Spring
- Spring Boot 2 + Redis 處理 Session 共享Spring BootRedisSession
- Spring Cloud Stream消費失敗後的處理策略(二):自定義錯誤處理邏輯SpringCloud
- 29.Spring Boot中異常處理與REST格式處理Spring BootREST
- spring boot 實現監聽器、過濾器、全域性異常處理Spring Boot過濾器
- spring中的統一異常處理Spring
- Spring如何處理執行緒併發Spring執行緒
- Spring多執行緒事務處理Spring執行緒
- ELK 處理 Spring Boot 日誌,不錯!Spring Boot
- Spring Batch + JPA 處理 Excel 檔案教程SpringBATExcel
- Spring MVC的請求處理邏輯SpringMVC
- Spring Boot乾貨系列:(十三)Spring Boot全域性異常處理整理Spring Boot
- Spring Cloud Gateway的全域性異常處理SpringCloudGateway
- Spring Boot優雅地處理404異常Spring Boot
- Spring @ControllerAdvice+@ExceptionHandler統一異常處理SpringControllerException
- Spring Cloud Gateway-自定義異常處理SpringCloudGateway
- Spring原始碼解讀之BeanFactoryPostProcessor的處理Spring原始碼Bean
- 【翻譯】在Spring WebFlux中處理錯誤SpringWebUX