如何排除从项目依赖项中扫描的 Spring bean?

Posted

技术标签:

【中文标题】如何排除从项目依赖项中扫描的 Spring bean?【英文标题】:How can I exclude Spring beans scanned from a project's dependency? 【发布时间】:2019-03-21 01:54:00 【问题描述】:

我有一个基于 Gradle 的项目,其中包含两个模块 mod1mod2。两者都是 Spring Boot 项目。 mod1 具有 mod2 作为依赖项:

dependencies 
    compile project(':mod2')
    //more deps

mod1mod2 类的基包都是 com.project。在mod2中,我在com.project.controllers下有一些Spring MVC控制器,所以当我启动mod1时,mod2控制器注册在Spring上下文中。

我想避免这种情况。

我尝试使用@SpringBootApplicationexclude 参数排除它们,但它不起作用(因为它们在另一个模块/依赖项中,而不是在项目本身中,我猜)。

是否可以通过 Gradle 配置以某种方式排除 mod2com.project.controllers 包?

【问题讨论】:

【参考方案1】:

据我所知不可能。 Gradle 将mod2 视为一个依赖项,因此它会引入所有内容,包括它的任何依赖项,具体取决于您在mod2build.gradle 文件中声明它们的方式。

由于它们是同一个包的一部分,它们将被 Spring 自动拾取,据我所知,从自动扫描中排除单个组件的唯一方法是明确指定要排除的组件excludeFilters:

excludeFilters = @Filter(type = FilterType.ASSIGNABLE_TYPE, classes = MyController.class, MyOtherController)

否则,您需要将这些特定控制器声明为单独的依赖项,当您拉入 mod2 时可以将其排除在外:

build.gradlem2

dependencies 
    compile project(':mod2') 
        exclude 'controllers'
    

build.gradlem1

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

从 Gradle 依赖项中排除 .class 文件

Android Studio - Gradle 实现 (...) exclude ... 不起作用(无法从依赖项中排除组)

Spring 3.0 学习-DI 依赖注入_创建Spring 配置-使用一个或多个XML 文件作为配置文件,使用自动注入(byName),在代码中使用注解代替自动注入,使用自动扫描代替xml中bea(