首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >可以在spring boot中禁用来自另一个自动配置类的自动配置类吗?

可以在spring boot中禁用来自另一个自动配置类的自动配置类吗?
EN

Stack Overflow用户
提问于 2018-05-24 00:39:37
回答 2查看 10.4K关注 0票数 8

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

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

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

更新

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

代码语言:javascript
复制
@EnableAutoConfiguration(exclude={
    DataSourceAutoConfiguration.class,
    HibernateJpaAutoConfiguration.class})

这会导致

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

代码语言:javascript
复制
@ImportAutoConfiguration(exclude={
    DataSourceAutoConfiguration.class, 
    HibernateJpaAutoConfiguration.class})

它什么也做不了。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-05-28 19:28:26

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

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

代码语言:javascript
复制
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中:

代码语言:javascript
复制
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=com.mycompany.db.MyExclusionFilter

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

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

详情请参见org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#filterorg.springframework.boot.autoconfigure.condition.OnClassCondition.java类的源代码。

票数 24
EN

Stack Overflow用户

发布于 2018-05-24 01:10:57

你可以排除然后通过

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50493461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档