контекстно-зависимый фильтр компонент сканирования - PullRequest
5 голосов
/ 30 сентября 2011

В моем веб-приложении на основе SpringMVC обычно используется 2 контекста: контекст веб-приложения для сервлета-диспетчера MVC и контекст родительского / корневого приложения.

<!-- the context for the dispatcher servlet -->
<servlet>
    <servlet-name>webApp</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath*:servlet-context.xml</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
</servlet>
....
<!-- the context for the root/parent application context -->
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:root-context.xml</param-value>
</context-param>

В этих контекстах я использую компонентное сканирование для загрузки всех bean-компонентов.Мои пакеты называются в соответствии с их вариантом использования (например, com.abc.registration, com.abc.login и т. Д.), А не на основе технологического уровня (например, com.abc.dao, com.abc.services и т. Д.)

Теперь мой вопрос: чтобы избежать дублирования сканирования некоторых классов, рекомендуется отфильтровывать классы компонентов-кандидатов для обоих контекстов, например включать только контроллер MVC для сканирования веб-контекста и включать все другие компоненты (сервисы,dao / repositorie) в контексте корневого приложения?

<!-- servlet-context.xml -->
<context:component-scan base-package="com.abc.myapp" use-default-filters="false">
    <context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

<!-- root-context.xml -->
<context:component-scan base-package="de.efinia.webapp">
    <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
</context:component-scan>

Или это не важно и не необходимо избегать такого дублирования для сканирования компонентов?

Ответы [ 2 ]

2 голосов
/ 30 сентября 2011

Мне нравится ваше решение в двух областях:

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

  2. Да, вы должны фильтровать классы. Очевидно, что это не проблема увеличения объема памяти, так как это незначительно (но увеличение времени запуска может быть значительным).

Однако наличие дублированных bean-компонентов (как контроллеров, так и служебных bean-компонентов) может привести к незначительным ошибкам и несогласованности Некоторый пул соединений был инициализирован два раза, некоторые запуска запускается два раза, вызывая неожиданное поведение. Если вы используете singleton scope, оставьте это как есть. Может быть, вы сразу не столкнетесь с некоторыми проблемами, но приятно подчиняться контрактам.

Кстати, обратите внимание, что есть тег <mvc:annotation-driven/>.

1 голос
/ 30 сентября 2011

Это действительно хорошая практика. В родительском контексте приложения не должно быть контроллеров.

Я не могу добавить больше аргументов, чтобы оправдать эту практику, но это, безусловно, чище.

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