虽然 classpath 扫描非常快,但通过在编译时创建一个静态的候选列表,可以提高大型应用程序的启动性能。在这种模式下,所有作为组件扫描目标的模块都必须使用这种机制。

    :::info 你现有的 @ComponentScan 或 指令必须保持不变,以请求上下文扫描某些包中的候选者。当 ApplicationContext 检测到这样的索引时,它会自动使用它而不是扫描 classpath。 :::

    要生成索引,需要为每个包含组件的模块添加一个额外的依赖,这些组件是组件扫描指令的目标。下面的例子展示了如何用 Maven 做到这一点。

    1. <dependencies>
    2. <dependency>
    3. <groupId>org.springframework</groupId>
    4. <artifactId>spring-context-indexer</artifactId>
    5. <version>5.3.15</version>
    6. <optional>true</optional>
    7. </dependency>
    8. </dependencies>

    对于 Gradle 4.5 和更早的版本,应该在 compileOnly 配置中声明该依赖关系,如下面的例子所示:

    1. dependencies {
    2. compileOnly "org.springframework:spring-context-indexer:5.3.15"
    3. }

    对于 Gradle 4.6 及更高版本,依赖性应该在 annotationProcessor 配置中声明,如下面的例子所示:

    1. dependencies {
    2. annotationProcessor "org.springframework:spring-context-indexer:5.3.15"
    3. }

    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 安排(就像根本没有索引存在一样)。 :::