Ste*_*eve 4 java spring spring-boot
我正在研究一个数据访问库,希望能够以最小的配置将它作为依赖项包含在其他项目中(最好只是自动装配一个仓库)。特别是,该库使用自动配置类(在中启用spring.factories)进行设置,并且需要禁用其他自动配置类才能工作(DataSourceAutoConfiguration和HibernateJpaAutoConfiguration)。
是否可以在依赖项目之外执行此操作?
为了使配置尽可能简单,我希望避免将排除项放在从属项目的@SpringBootApplication注释或其spring.autoconfigure.exclude属性中。
更新:
在我的@Configuration上,我尝试添加注释:
@EnableAutoConfiguration(exclude={
DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)
这导致
IllegalStateException:配置问题:已检测到循环@Import
和
@ImportAutoConfiguration(exclude={
DataSourceAutoConfiguration.class,
HibernateJpaAutoConfiguration.class})
Run Code Online (Sandbox Code Playgroud)
根本什么都不做。
有一个非常方便的界面,称为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;
}
}
Run Code Online (Sandbox Code Playgroud)
该课程需要注册spring.factories才能上班。将库中的以下行添加到META-INF/spring.factories:
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=com.mycompany.db.MyExclusionFilter
Run Code Online (Sandbox Code Playgroud)
您不需要对依赖项目进行任何更改。只需将库添加为依赖项,您指定的自动配置就不会为整个应用程序加载。
注意:您可以添加多个导入过滤器,只有在所有导入过滤器中未过滤的自动配置类将被加载。
有关详细信息,请参见org.springframework.boot.autoconfigure.AutoConfigurationImportSelector#filter和org.springframework.boot.autoconfigure.condition.OnClassCondition.java类的源代码。
| 归档时间: |
|
| 查看次数: |
3329 次 |
| 最近记录: |