Как я могу ограничить проверку компонентов Spring только файлами в моей войне? - PullRequest
6 голосов
/ 17 июня 2011

Я использую компонентное сканирование Spring, чтобы найти компоненты в моем приложении.

<context:component-scan base-package="com.myapp"/>

Однако производительность при развертывании приложения на нашем промежуточном сервере (JBoss 5 с большим количеством развернутых приложений) значительно ниже, чем в процессе разработки (также JBoss 5, но мало приложений).Сканирование компонента занимает много времени.Я подозреваю, что это из-за гораздо большего пути к классам?

Есть ли простой способ заставить Spring искать только бины в моем файле войны?т.е. WEB-INF / классы и WEB-INF / lib?Или есть другое решение?

Ответы [ 5 ]

3 голосов
/ 12 июля 2013

Я не знаю, есть ли у вас решение, но у меня и коллеги есть потенциальное решение.

В полном раскрытии мы работаем для Red Hat над проектом Snowdrop , который обеспечивает поддержку приложений Spring на JBoss.

Потенциальное решение - использовать компонентное сканирование в пространстве имен jboss snowdrop - https://github.com/snowdrop/snowdrop/tree/CustomBeanScanner

Используя это, вы можете добавить пользовательский компонентный сканер, чтобы вместо <context:component-scan base-package="foo.bar"/> вы использовали: <jboss:component-scan base-package="foo.bar"/>.

Мы знаем, что это работает, но мы не знаем, захочет ли кто-нибудь изменить свое приложение, чтобы использовать эту функцию. Стоит ли намеренное сцепление увеличивать скорость?

Код указан в ветке, указанной выше, и каждый может попробовать / использовать.

спасибо, Joshua

3 голосов
/ 17 июня 2011

Два совета;

  • старайтесь быть как можно точнее с базовыми пакетами: вы можете указать несколько пакетов в атрибуте базового пакета, разделенных запятыми.
  • использовать фильтры;проверьте документы здесь .- вы можете указать аннотации для сканирования (например, если вы используете только @Component), а также можете указать регулярное выражение, которому будет соответствовать имя класса.
2 голосов
/ 20 июня 2011

Что если вы укажете

<context:component-scan base-package="com.myapp" resource-pattern="/WEB-INF/classes/**/*.class"/>

или какая-то альтернатива этому подходу?

2 голосов
/ 17 июня 2011

Вы должны установить настройки сканирования classpath для вашего пакета (например, "com.foo").Тем не менее - количество классов в вашем пути к классам не должно сильно отличаться по стадии от разработки.Это будут ваши WAR плюс общесерверные классы, которые должны быть примерно одинаковыми.В частности, у вас не будет классов из других WAR в вашем classpath.

Я подозреваю, что сервер перегружен.Вы должны получить некоторую статистику с этой машины: то есть, какова загрузка ЦП?Много ли дискового ввода-вывода?Является ли пейджинг / свопинг чрезмерным?Также проверьте использование памяти JVM - возможно, она тратит много времени на сборку мусора.

0 голосов
/ 17 июня 2011

Разве вы не можете просто конкретизировать директиву о базовом пакете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...