虽然 classpath 扫描非常快,但通过在编译时创建一个静态的候选列表,可以提高大型应用程序的启动性能。在这种模式下,所有作为组件扫描目标的模块都必须使用这种机制。
:::info
你现有的 @ComponentScan 或
要生成索引,需要为每个包含组件的模块添加一个额外的依赖,这些组件是组件扫描指令的目标。下面的例子展示了如何用 Maven 做到这一点。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-indexer</artifactId>
<version>5.3.15</version>
<optional>true</optional>
</dependency>
</dependencies>
对于 Gradle 4.5 和更早的版本,应该在 compileOnly 配置中声明该依赖关系,如下面的例子所示:
dependencies {
compileOnly "org.springframework:spring-context-indexer:5.3.15"
}
对于 Gradle 4.6 及更高版本,依赖性应该在 annotationProcessor 配置中声明,如下面的例子所示:
dependencies {
annotationProcessor "org.springframework:spring-context-indexer:5.3.15"
}
spring-context-indexer 工件会生成一个 META-INF/spring.component
文件,并包含在 jar 文件中。
:::info 当在你的 IDE 中使用这种模式时,spring-context-indexer 必须被注册为注解处理器,以确保候选组件更新时索引是最新的。 ::: :::tips 当在 classpath 上发现 META-INF/spring.component 文件时,索引会自动启用。如果索引对某些库(或用例)是部分可用的,但不能为整个应用程序建立索引,你可以通过将 spring.index.ignore 设置为true,或者通过 SpringProperties 机制,退回到常规的 classpath 安排(就像根本没有索引存在一样)。 :::