避免对 Spring Configuration 类进行类路径扫描

Posted

技术标签:

【中文标题】避免对 Spring Configuration 类进行类路径扫描【英文标题】:Avoid classpath scanning for Spring Configuration classes 【发布时间】:2014-10-09 15:30:20 【问题描述】:

使用 Spring,可以使用带有 @Configuration 注释的类来配置应用程序的各个方面。这些配置类可以直接导入或使用类路径扫描收集。

在我看来,类路径扫描尤其对配置类有几个缺点。 一个主要缺点是,对于多项目(gradle 或 maven 中的子项目),IDE 很容易与构建系统就何时进入类路径达成一致。

特别是在我当前的情况下,gradle 将为每个子项目隔离类路径测试资源(src/main/test 中的文件),这意味着一个子项目中的测试不会通过类路径扫描从其他子项目测试中找到 Spring 类(除非指定这)。但是 IntelliJ (13.1.4) 没有进行这种隔离,导致 gradle 和 IntelliJ 的测试结果不同。这可能会在任何时候再次发生(新的 intelliJ 或 Eclipse 版本),虽然像任何其他错误一样,这是一个主要的烦恼。

我们面临的另一个问题是Spring提供了一个运行测试的工具包,比如

@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
public class FooTest ...

或者

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration
public class FooTest ...

由于这些测试类最终位于类路径中,它们还可以通过被检测并用作 Spring 配置来巧妙地影响其他测试。

那么扫描类路径以查找配置通常是不好的,还是我们错过了一些明显的缓解措施?

【问题讨论】:

【参考方案1】:

到目前为止,我通常很少使用类路径扫描,遵循以下规则:

配置应该只扫描同一模块中的包 configuratino 应该只扫描它自己的包或子包

否则,使用@Import 来定位另一个配置似乎要好得多。它使意图和依赖关系更加明确,并有助于避免类路径问题。

【讨论】:

以上是关于避免对 Spring Configuration 类进行类路径扫描的主要内容,如果未能解决你的问题,请参考以下文章

IDEA中添加spring-boot-configuration-processor依赖但yml文件对自己创建的类没有提示的解决办法

Spring Cloud Feign 使用方法与性能优化

Spring Boot 有哪些优点?

Spring中的@Configuration注解你真的了解吗?

原创 | 我被面试官给虐懵了,竟然是因为我不懂Spring中的@Configuration

Spring 注解配置原理