簡體   English   中英

排除基於應用程序 yaml 文件的自動配置 bean

[英]Exclude autoconfiguration beans based on application yaml file

我有一些 bean 想要根據我的 application.yml 文件上的配置從自動配置中排除:

database:
  enabled: false

為此,我創建了一個自定義排除過濾器以將我的 bean 排除在自動配置之外:

public class DatabaseExclusionFilter implements AutoConfigurationImportFilter {

private static final Set<String> DATABASE_BEANS_SKIP = new HashSet<>(
        Arrays.asList("org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration",
                "org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration"));


@Value("${database.enabled}")
private boolean enabled;

@Override
public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
    List<Boolean> excludeBeans = new ArrayList<>();
    if (!enabled) {
        excludeBeans = match(Arrays.asList(autoConfigurationClasses));
    }
    return convertToPrimitiveArray(excludeBeans);
}
}

這樣,如果數據庫在我的項目中被禁用,我可以將配置 bean 排除在自動注冊之外。 (這個class在org.springframework.boot.autoconfigure.AutoConfigurationImportFilter的spring.factory文件中也有注明)。

這工作正常,但我有一個問題,我無法從我的 yaml 文件中讀取值,我認為這是一個優先級問題,可能在調用AutoConfigurationImportFilter時, @Value尚未准備好工作。 我該如何解決這個問題?

實現EnvironmentAware接口並從環境中獲取屬性。

public class DatabaseExclusionFilter implements AutoConfigurationImportFilter, EnvironmentAware {

    private static final Set<String> DATABASE_BEANS_SKIP = new HashSet<>(
        Arrays.asList("org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration",
                "org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration"));

    private Environment environment;

    @Override
    public boolean[] match(String[] autoConfigurationClasses, AutoConfigurationMetadata autoConfigurationMetadata) {
        List<Boolean> excludeBeans = new ArrayList<>();
        if (!Boolean.parseBoolean(environment.getProperty("database.enabled")))) {
            excludeBeans = match(Arrays.asList(autoConfigurationClasses));
        }
        return convertToPrimitiveArray(excludeBeans);
    }

    @Override
    public void setEnvironment(Environment environment) {
        this.environment = environment;
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM