我正在开发一个数据访问库,并希望能够以最少的配置将其作为依赖项包含在其他项目中(理想情况下只是 Autowiring 一个存储库)。特别是,该库使用自动配置类(在 spring.factories
中启用)进行 self 设置,并且需要禁用其他自动配置类才能工作(DataSourceAutoConfiguration
和 HibernateJpaAutoConfiguration
)。
是否可以在依赖项目之外执行此操作?
为了使配置尽可能简单,我想避免在依赖项目的 @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#filter
和org.springframework.boot.autoconfigure.condition.OnClassCondition.java
源码类。
关于java - 是否可以在 spring boot 中禁用另一个自动配置类的自动配置类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50493461/