如何排除从项目依赖项中扫描的 Spring bean?
Posted
技术标签:
【中文标题】如何排除从项目依赖项中扫描的 Spring bean?【英文标题】:How can I exclude Spring beans scanned from a project's dependency? 【发布时间】:2019-03-21 01:54:00 【问题描述】:我有一个基于 Gradle 的项目,其中包含两个模块 mod1
和 mod2
。两者都是 Spring Boot 项目。 mod1
具有 mod2
作为依赖项:
dependencies
compile project(':mod2')
//more deps
mod1
和 mod2
类的基包都是 com.project
。在mod2
中,我在com.project.controllers
下有一些Spring MVC控制器,所以当我启动mod1
时,mod2
控制器注册在Spring上下文中。
我想避免这种情况。
我尝试使用@SpringBootApplication
的exclude
参数排除它们,但它不起作用(因为它们在另一个模块/依赖项中,而不是在项目本身中,我猜)。
是否可以通过 Gradle 配置以某种方式排除 mod2
的 com.project.controllers
包?
【问题讨论】:
【参考方案1】:据我所知不可能。 Gradle 将mod2
视为一个依赖项,因此它会引入所有内容,包括它的任何依赖项,具体取决于您在mod2
的build.gradle
文件中声明它们的方式。
由于它们是同一个包的一部分,它们将被 Spring 自动拾取,据我所知,从自动扫描中排除单个组件的唯一方法是明确指定要排除的组件excludeFilters
:
excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyController.class, MyOtherController)
否则,您需要将这些特定控制器声明为单独的依赖项,当您拉入 mod2
时可以将其排除在外:
build.gradle
为m2
dependencies
compile project(':mod2')
exclude 'controllers'
build.gradle
为m1
dependencies
compile project(':controllers')
类似的东西。我不是 Gradle 专家,因此请参阅文档:
https://docs.gradle.org/current/userguide/managing_transitive_dependencies.html#sec:excluding_transitive_module_dependencies
https://docs.gradle.org/current/userguide/introduction_dependency_management.html
【讨论】:
谢谢。你知道@SpringBootApplication
的“exclude”参数和@ComponentScan
的“excludeFilters”的区别吗?我已经尝试了第一个,但它不起作用。关于创建另一个“控制器”模块,我不可能这样做,但还是谢谢你。以上是关于如何排除从项目依赖项中扫描的 Spring bean?的主要内容,如果未能解决你的问题,请参考以下文章
Android apk - 如何使用 gradle 从 3rd 方依赖项中排除 .so 文件
如何从 Kotlin DSL build.gradle 中的所有依赖项中排除库?
使用 Spring Data Rest 时如何从组件扫描中排除 @Repository
Android Studio - Gradle 实现 (...) exclude ... 不起作用(无法从依赖项中排除组)
Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea(