網站首頁 編程語言 正文
問題描述:有時候我們引入SpringBoot的Start組件的時候,默認就根據SPI機制加載了相應的自動配置的類;比如通過META-INF下的spring.factories,來讀取你需要默認引入的自動配置的類;但是有時候你不想要這些功能,簡單一點來說就是在啟動類中過濾掉該類
實現(xiàn)方式一:
@SpringBootApplication(exclude = {KafkaConsumerConfig.class})
功能說明:啟動容器時排除指定配置類。
實現(xiàn)方式二:
功能要求:通過一個開關配置或者自定義規(guī)則來決定是否加載該類。
如何實現(xiàn):SpringBoot中有一個針對SPI加載的類過濾接口名字AutoConfigurationImportFilter
這個類會在啟動的時候通過SPI的機制回調,然后執(zhí)行它的match方法來絕對目前SPI加載的類是否會被過濾掉;
功能實戰(zhàn):
import org.springframework.boot.autoconfigure.AutoConfigurationImportFilter;
import org.springframework.boot.autoconfigure.AutoConfigurationMetadata;
import org.springframework.context.EnvironmentAware;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class KafkaAutoConfigurationImportFilter implements AutoConfigurationImportFilter, EnvironmentAware {
private Environment environment;
/**
* 過濾的map
* K : 代表配置文件中的屬性是否為true,如果為true的話就會過濾掉value中的值
* V : 過濾掉configuration的全路徑
*/
private Map filterAutoConfigurationMap = new LinkedHashMap<>();
public KafkaAutoConfigurationImportFilter() {
filterAutoConfigurationMap
.put("spring.kafka.consumer.multiple-group", "com.elab.core.kafka.config.KafkaConsumerConfig");
}
@Override
public void setEnvironment(Environment environment) {
this.environment = environment;
}
@Override
public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
Set filterClass = new HashSet<>();
// 獲取配置文件中的屬性名稱的值,并決定是否過濾
filterAutoConfigurationMap.forEach((k, v) -> {
Boolean enableProperty = this.environment.getProperty(k, Boolean.class);
if (enableProperty) {
filterClass.add(v);
}
});
if (filterClass.size() > 0) {
boolean[] skip = new boolean[autoConfigurationClasses.length];
for (int i = 0; i < autoConfigurationClasses.length; i++) {
String autoConfigurationClass = autoConfigurationClasses[i];
if (!filterClass.contains(autoConfigurationClass)) {
skip[i] = true;
}
}
return skip;
}
return new boolean[0];
}
}
功能代碼說明:根據配置文件中的變量:spring.kafka.consumer.multiple-group得到的值是true還是false決定是否過濾掉com.elab.core.kafka.config.KafkaConsumerConfig類;
注意:在啟動的時候引入它,在項目resouce文件新建META-INF文件夾在其中新建一個spring.factories類然后加入內容:
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=com.elab.data.route.config.KafkaAutoConfigurationImportFilter
啟動的時候就會回調該類,基于類中定義的規(guī)則來決定是否加載SPI中默認引用的類了;
想要了解運行流程可以查看org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#filter
原文鏈接:https://blog.csdn.net/zhouzhiwengang/article/details/122866528
相關推薦
- 2022-04-11 K8S部署Kafka界面管理工具(kafkamanager)方法詳解_云其它
- 2022-10-11 Android之InstanceState詳解
- 2022-06-28 ASP.NET?WebAPI導出CSV_實用技巧
- 2022-08-30 C++超詳細介紹模板_C 語言
- 2022-12-25 使用Python可設置抽獎者權重的抽獎腳本代碼_python
- 2023-01-13 Python實現(xiàn)數字小寫轉大寫的示例詳解_python
- 2022-07-26 用VScode編寫C++大型項目的方法步驟_C 語言
- 2023-02-15 PyQt5頁面跳轉問題及解決方式_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細win安裝深度學習環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支