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

标签 java spring spring-boot

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

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

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

更新:

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

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

这导致

IllegalStateException: Configuration problem: A circular @Import has been detected

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

什么都不做。

最佳答案

有一个非常方便的接口(interface),称为 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源码类。

关于java - 是否可以在 spring boot 中禁用另一个自动配置类的自动配置类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493461/

相关文章:

mysql - Spring 启动 MySQL : LAZY Loading issue - No operations allowed after statement closed

java - SpringBoot使用@RequestBody注释将整数原子转换为 boolean 值?如何拒绝将整数转换为 boolean 值?

java - 如何为具有 22G 堆的服务器正确设置 G1GC 选项

java - 如何重新排序 Netbeans 中自动生成的方法?

java - JOOQ/SQL 如何根据外键选择最短日期

java - AJAX JSON 数据检索(Portlet+Liferay+JSON+Spring)

java - 从 JSP/Servlet/Portlets(Jetspeed) 迁移到 Spring 项目 - 应用程序设计

java - java中的对象引用和类型转换

java - Camel REST DSL swagger 输出包含无效的 responseSchema 元素

Spring Web应用程序在启动时从数据库初始化