当前位置: 首页 > 知识库问答 >
问题:

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

汪鸿波
2023-03-14

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

是否可以在从属项目之外执行此操作?

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

更新:

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

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

这导致了

IllegalState异常:配置问题:检测到循环@导入

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

这根本什么也没做。

共有2个答案

米迪
2023-03-14

你可以排除然后通过

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

但是,您可以通过添加@EnableAutoCon人和配置(排除={DataSourceAutoConfiguration.class,HibernateJpaAutoConfiguration.class})@配置中排除它们。

山凌
2023-03-14

有一个非常方便的界面,称为AutoConfiguration的,它决定应该加载哪个自动配置。这也是@

在库中,添加以下类:

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

这个类需要在<code>spring中注册。工厂开始工作。将库中的以下行添加到META-INF/spring.factors中:

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

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

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

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

 类似资料:
  • 4.1 根据条件的自动配置 @conditional是基于条件的自动配置,一般配合Condition接口一起使用,只有接口实现类返回true,才装配,否则不装配. 用实现了Condition接口的类传入@Conditional中 @Conditional可以标记在配置类的方法中,也可以标记在配置类上.标记的位置不同,作用域不同. @Conditional可以传入多个实现了condition接口的类

  • 我刚开始使用Java,到处搜索,但无论出于何种原因都无法找到解决方案。我的问题对我来说似乎很简单:我在同一个文件夹中有两个类,该文件夹是我的包,为了说明: 我需要在第2类中创建第1类的实例,但它就是不起作用。这是一个示例: 文件路径: 文件路径: 我得到这个错误 根据要求,完整的源代码:注:class1=ClientIndividual,class2=涉众 第一个文件 第二个文件 第三个文件(接口

  • “在Meta-INF/Spring.Factories中找不到自动配置类” 最小示例: 使用SpringInitializr(https://start.spring.io),在几秒钟内就可以创建一个迷你应用程序来复制这个问题。使用的SpringInitializr标记是:“web”和“vaadin”。 运行应用程序时使用 您将得到以下错误消息: “在Meta-INF/Spring.Factori

  • 本文向大家介绍浅谈springboot自动配置原理,包括了浅谈springboot自动配置原理的使用技巧和注意事项,需要的朋友参考一下 从main函数说起 一切的开始要从SpringbootApplication注解说起。 其中最重要的就是EnableAutoConfiguration注解,开启自动配置。 通过Import注解导入AutoConfigurationImportSelector。在这

  • 我们有一个基本的JPA存储库类,其中有一些我们在项目中使用的附加实用程序方法。在Spring Data JPA留档之后,我们创建了这个类,并在配置类中使用@EnableJpaRepository注释,如以下示例所示: 由于配置类不在应用程序根包中,因此我们还设置了base PackageClass属性,以便找到我们的存储库。一切都按预期进行,因此到目前为止没有问题。 现在,我们想创建一个sprin

  • 问题内容: 如何从另一个类中处置JFrame?我的代码在下面列出。我使用Netbeans生成表单来生成窗口。我想使用另一个类进行处理(名称为needDispose)。 NETBEANS GENERATE (重要方法是getMainFrame()) 问题答案: 这是一个如何从另一个本身就是JFrame的类中释放JFrame的示例: