網(wǎng)站首頁 編程語言 正文
問題描述:有時候我們引入SpringBoot的Start組件的時候,默認(rèn)就根據(jù)SPI機制加載了相應(yīng)的自動配置的類;比如通過META-INF下的spring.factories,來讀取你需要默認(rèn)引入的自動配置的類;但是有時候你不想要這些功能,簡單一點來說就是在啟動類中過濾掉該類
實現(xiàn)方式一:
@SpringBootApplication(exclude = {KafkaConsumerConfig.class})
功能說明:啟動容器時排除指定配置類。
實現(xiàn)方式二:
功能要求:通過一個開關(guān)配置或者自定義規(guī)則來決定是否加載該類。
如何實現(xiàn):SpringBoot中有一個針對SPI加載的類過濾接口名字AutoConfigurationImportFilter
這個類會在啟動的時候通過SPI的機制回調(diào),然后執(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];
}
}
功能代碼說明:根據(jù)配置文件中的變量:spring.kafka.consumer.multiple-group得到的值是true還是false決定是否過濾掉com.elab.core.kafka.config.KafkaConsumerConfig類;
注意:在啟動的時候引入它,在項目resouce文件新建META-INF文件夾在其中新建一個spring.factories類然后加入內(nèi)容:
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=com.elab.data.route.config.KafkaAutoConfigurationImportFilter
啟動的時候就會回調(diào)該類,基于類中定義的規(guī)則來決定是否加載SPI中默認(rèn)引用的類了;
想要了解運行流程可以查看org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#filter
原文鏈接:https://blog.csdn.net/zhouzhiwengang/article/details/122866528
相關(guān)推薦
- 2022-09-03 C++日期類(Date)實現(xiàn)的示例代碼_C 語言
- 2022-10-08 jQuery動態(tài)添加元素后元素注冊事件失效解決_jquery
- 2022-12-12 Python實現(xiàn)打印九九乘法表的不同方法總結(jié)_python
- 2022-11-14 React前端路由應(yīng)用介紹_React
- 2022-06-08 基于Springboot實現(xiàn)專業(yè)認(rèn)證材料管理系統(tǒng)
- 2022-07-30 SpringBoot的數(shù)據(jù)校驗(@Validated注解)、關(guān)于validation無法導(dǎo)入的問題解
- 2022-06-04 Android基于Fresco實現(xiàn)圓角和圓形圖片_Android
- 2022-02-09 深入了解C++異常處理_C 語言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支