Как я могу создать индекс компонента Spring 5?

Spring Framework 5, по-видимому, содержит поддержку «индекса компонентов», который находится в META-INF/spring.components и может использоваться, чтобы избежать необходимости сканирования путей к классам и, таким образом, я полагаю, улучшить время запуска веб-приложений.

Видеть:

Как я могу создать такой индекс компонента для существующего веб-приложения, которое я планирую обновить до Spring 5?

(В идеале, я думаю, он будет автоматически генерироваться во время сборки с помощью Maven, но любые другие работоспособные подходы, по крайней мере, дадут мне отправную точку для работы)


person Matt Sheppard    schedule 12.11.2017    source источник
comment
Вы уже проверили репозиторий Stephane Nicoll, который проходит некоторые тесты Примеры? В этих примерах используется зависимость в pom для построения этого индекса на основе аннотированного @Components   -  person Dovmo    schedule 13.11.2017
comment
А, нет, не нашел - спасибо, посмотрю!   -  person Matt Sheppard    schedule 14.11.2017
comment
Вам с ним повезло? Я попытался включить spring-context-indexer в свой pom, но не заметил никакой разницы во времени загрузки и не увидел созданного индексного файла. До сих пор я не смог заставить это работать   -  person Zipper    schedule 28.11.2017
comment
Я еще не вернулся к этому, извините - я обязательно отчитаюсь, если / когда я это сделаю.   -  person Matt Sheppard    schedule 30.11.2017
comment
@Zipper, у меня это отлично сработало. Он привязан к цели Maven, в частности к цели пакета, поэтому все, что мне нужно было сделать, это запустить пакет mvn, и он создал мой индексный файл.   -  person bh5k    schedule 17.12.2017
comment
Хорошо, спасибо, может быть, это была моя проблема, я не уверен, когда работаю в режиме разработки, действительно ли он запускает пакет   -  person Zipper    schedule 18.12.2017
comment
Вряд ли существует какая-либо документация для этого. Созданный файл находится в WEB-INF/classes/META-INF/spring.components в полученном файле войны с использованием плагина maven War. Если у вас неполный индекс, вы получите ошибку bean not found. У меня есть несколько модулей, зависящих друг от друга, и он не сканирует/индексирует зависимые модули, поэтому при запуске я получаю сообщение об ошибке.   -  person otterslide    schedule 13.01.2018


Ответы (2)


В Spring 5 добавлена ​​новая функция для повышения скорости запуска больших приложений.

он создает список компонентов-кандидатов во время компиляции.

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

Чтобы сгенерировать индекс, нам просто нужно добавить приведенную ниже зависимость к каждому модулю.

Мейвен:

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

Грейдл

dependencies {
    compileOnly("org.springframework:spring-context-indexer:5.0.3.RELEASE")
}

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

Ссылка: 1.10.9. Создание индекса компонентов-кандидатов

person Niraj Sonawane    schedule 23.01.2018
comment
Да, интересно, как-нибудь попробую. Кажется очень странным, что механизм здесь (по крайней мере, в maven) добавляет зависимость к модулю, хотя я ожидал, что это будет плагин maven или что-то в этом роде. Когда именно происходит генерация в процессе сборки? - person Matt Sheppard; 25.01.2018
comment
Если вы читали документацию, там говорится, что в IDE требуется annotation-processor: При работе с этим режимом в вашей IDE Spring-context-indexer должен быть зарегистрирован как обработчик аннотаций, чтобы сделать убедиться, что индекс обновлен при обновлении компонентов-кандидатов. ! Я не думаю, что он интегрирован с maven :-( - person flob; 26.03.2018
comment
Наконец-то вернулся, чтобы попробовать это (с ‹scope›provided‹/scope›, а не option=true, если это имеет значение), и это действительно вызывает создание файла spring.compoents — я думаю, добавление зависимости вызывает аннотацию процессор для применения (и scope=provided позволяет избежать фактической упаковки банки). К сожалению, по какой-то причине полученная война не может быть развернута с исключением No Qualification bean, но это другая проблема - спасибо. - person Matt Sheppard; 30.05.2018
comment
Ах, моя проблема, похоже, заключалась в том, что мне нужно было, чтобы все зависимости, которые также создавали bean-компоненты, имели spring.components, поэтому я заработал после того, как убедился, что - К сожалению, это, похоже, очень мало влияет на время запуска в целом. (похоже, экономит в среднем около 1 секунды в лучшем случае). - person Matt Sheppard; 30.05.2018
comment
Но для зависимости jar это не работает. Не могли бы вы взглянуть на этот stackoverflow.com/questions/53718184/ - person Mahesh Bhuva; 11.12.2018
comment
В Gradle 4.6+ вы можете добавить зависимость как annotationProcessor. См. docs.gradle.org/4.6. / - person gorodkovskaya; 17.01.2019

Файлы META-INF/spring.components генерируются библиотекой процессора аннотаций под названием spring-context-indexer. Если вы добавите эту библиотеку как «путь процессора аннотаций» в плагин maven-compiler-plugin, файлы будут созданы автоматически во время сборки:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-compiler-plugin</artifactId>
  <configuration>
    <annotationProcessorPaths>
      <path>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context-indexer</artifactId>
        <version>5.0.6.RELEASE</version>
      </path>
    </annotationProcessorPaths>
    ...
  </configuration>
</plugin>

Для этой установки требуется плагин maven-compiler-plugin версии 3.5 или выше.

См. также: https://maven.apache.org/plugins/maven-compiler-plugin/compile-mojo.html#annotationProcessorPaths

person Stefan Ferstl    schedule 23.05.2018