Spring IoC контейнер: сканирование classpath, генерация индекса компонентов-кандидатов

Хотя сканирование пути к классам очень быстрое, можно улучшить производительность запуска больших приложений, создав статический список кандидатов во время компиляции. В этом режиме все модули, которые являются целью сканирования компонентов, должны использовать этот механизм.

Ваши существующие директивы @ComponentScan или <context:component-scan должны оставаться без изменений, чтобы запрашивать контекст для сканирования кандидатов в определенных пакетах. Когда ApplicationContext обнаруживает такой индекс, он автоматически использует его, а не сканирует путь к классам.

Чтобы создать индекс, добавьте дополнительную зависимость к каждому модулю, который содержит компоненты, которые являются целями для директив сканирования компонентов. В следующем примере показано, как это сделать с Maven:

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-indexer</artifactId>
        <version>5.2.7.RELEASE</version>
        <optional>true</optional>
    </dependency>
</dependencies>

В Gradle 4.5 и более ранних версиях зависимость должна быть объявлена в конфигурации compileOnly, как показано в следующем примере:

dependencies {
    compileOnly "org.springframework:spring-context-indexer:5.2.7.RELEASE"
}

В Gradle 4.6 и более поздних версиях зависимость должна быть объявлена в конфигурации annotationProcessor, как показано в следующем примере:

dependencies {
    annotationProcessor "org.springframework:spring-context-indexer:{spring-version}"
}

Этот процесс генерирует файл META-INF/spring.components, который включен в файл jar.

При работе с этим режимом в вашей среде IDE индексатор контекста Spring (spring-context-indexer) должен быть зарегистрирован как процессор аннотаций, чтобы обеспечить актуальность индекса при обновлении компонентов-кандидатов.

Индекс включается автоматически при обнаружении META-INF/spring.components на пути к классам. Если индекс частично доступен для некоторых библиотек (или вариантов использования), но не может быть построен для всего приложения, вы можете вернуться к обычному расположению пути к классам (как будто никакого индекса не было вообще), установив spring.index.ignore в значение true, либо как системное свойство, либо в файле spring.properties в корне пути к классам.


Читайте также:


Комментарии

Популярные сообщения из этого блога

Методы класса Object в Java

Как получить текущий timestamp в Java

Основные опции JVM для повышения производительности и отладки