Производительность сканирования компонентов

Я пытаюсь понять, сколько времени сканирование компонентов добавляет создание контекста приложения. В настоящее время создание контекста приложения занимает около 100 секунд, и я подозреваю, что сканирование компонентов для определения компонентов требует больших затрат. У меня есть ряд вопросов следующего содержания:

  1. Как измерить общее время, затраченное на сканирование компонентов?

  2. Влияет ли количество базовых записей context:component-scan на пространство поиска? Я предполагаю, что при сканировании компонентов используется PathMatchingResourcePatternResolver для сканирования каждой записи в пути к классам и последующего поиска классов, соответствующих регулярному выражению базового пакета. Более эффективно структурировать метаданные, например:

<context:component-scan base-package="foo" /> <context:component-scan base-package="bar" /> <context:component-scan base-package="baz" />

or

<context:component-scan base-package="foo, bar, baz" />

  1. Я также предполагаю, что количество классов, в которых PathMatchingResourcePatternResolver влияет на сканирование компонентов, поскольку проверка соответствующих аннотаций компонентов требует проверки файла класса. Так является ли хорошей практикой хранить классы с аннотациями только в четко определенном пакете, чтобы уменьшить число проверяемых классов?

  2. Перечислены ли где-нибудь известные передовые практики о том, какие соображения следует учитывать при проектировании, чтобы получить наиболее оптимальную производительность сканирования компонентов?


person toaler    schedule 11.10.2017    source источник


Ответы (1)


Автоматическое сканирование классов требует сканирования всех классов в указанных пакетах и ​​может занять много времени. Если в вашем пакете почти все классы определены как Bean, то можно использовать однокомпонентное сканирование.

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

<context:component-scan base-package="foo" />
<context:component-scan base-package="bar" />
<context:component-scan base-package="baz" />

В противном случае все bean-компоненты определяются в конфигурации spring вместо автоматического сканирования, но это может увеличить размер вашего файла.

person Mohd Yasin    schedule 12.10.2017
comment
Помимо этого, вы также можете включать/исключать аннотации в зависимости от вашего контекста. Например, контекст Spring MVC включает только bean-компоненты @*Controller. - person voliveira89; 12.10.2017
comment
Я думаю, что суть сообщения Mhod заключается в том, чтобы ограничить пространство поиска PathMatchingResourcePatternResolver, пытаясь сохранить управляемые bean-компоненты spring только в пакетах, соответствующих базовому пакету, чтобы уменьшить сканирование классов ASM. Это имеет смысл для меня. - person toaler; 13.10.2017