java 排除基于应用程序yaml文件的自动配置bean

rn0zuynd  于 2023-01-07  发布在  Java
关注(0)|答案(1)|浏览(199)

我有一些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。(这个类也在org.springframework. Boot .autoconfigure.AutoConfigurationImportFilter上的spring.factory文件中指出)。
这很好用,但是我有一个问题,我不能从我的yaml文件中读取值,我认为这是一个优先级问题,也许当调用AutoConfigurationImportFilter时,@Value还没有准备好工作。我该如何解决这个问题?

3pmvbmvn

3pmvbmvn1#

实现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;
    }
}

相关问题