日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達者為師

網(wǎng)站首頁 編程語言 正文

SpringBoot 動態(tài)過濾自動配置類

作者:在奮斗的大道 更新時間: 2022-04-09 編程語言

問題描述:有時候我們引入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

欄目分類
最近更新