繁体   English   中英

是否可以在spring boot中从另一个自动配置类中禁用自动配置类?

[英]Is it possible to disable an autoconfiguration class from another autoconfiguration class in spring boot?

我正在开发一个数据访问库,并希望能够以最小配置将其作为依赖项包含在其他项目中(理想情况下只需自动备份一个repo)。 特别是,这个库使用自动配置类(在spring.factories启用)设置自己,并且需要禁用其他自动配置类( DataSourceAutoConfigurationHibernateJpaAutoConfiguration )。

是否可以在依赖项目之外执行此操作?

为了使配置尽可能简单,我想避免在依赖项目的@SpringBootApplication注释或其spring.autoconfigure.exclude属性中放置排除。

更新

在我的@Configuration上,我尝试添加注释:

@EnableAutoConfiguration(exclude={
    DataSourceAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class})

这导致

IllegalStateException:配置问题:已检测到循环@Import

@ImportAutoConfiguration(exclude={
    DataSourceAutoConfiguration.class, 
    HibernateJpaAutoConfiguration.class})

哪个什么都不做。

有一个非常方便的接口叫做AutoConfigurationImportFilter ,它决定应该加载哪个自动配置。 这也是@ConditionalOnClass注释的工作原理。

在您的库中,添加以下类:

public class MyExclusionFilter
        implements AutoConfigurationImportFilter {

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

    @Override
    public boolean[] match(String[] classNames, AutoConfigurationMetadata metadata) {
        boolean[] matches = new boolean[classNames.length];

        for(int i = 0; i< classNames.length; i++) {
            matches[i] = !SHOULD_SKIP.contains(classNames[i]);
        }
        return matches;
    }
}

这个类需要在spring.factories注册才能工作。 将库中的以下行添加到META-INF/spring.factories

org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=com.mycompany.db.MyExclusionFilter

您无需对依赖项目进行任何更改。 只需将库添加为依赖项,就不会为整个应用程序加载您指定的自动配置。

注意:您可以添加多个导入过滤器,只会加载未在所有导入过滤器中过滤的自动配置类。

有关详细信息,请参阅org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#filterorg.springframework.boot.autoconfigure.condition.OnClassCondition.java类的源代码。

你可以排除然后通过

@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class}))

但你可以通过添加@EnableAutoConfiguration(exclude= {DataSourceAutoConfiguration.class, HibernateJpaAutoConfiguration.class})在你的@Configuration排除它们

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM