В дополнение к ответу @ GaryF , существует следующее прекрасное решение этой проблемы (используется в проектах, генерируемых Spring Roo
):
MyApp-config.xml
<!-- Load everything except @Controllers -->
<context:component-scan base-package="com.myapp">
<context:exclude-filter expression="org.springframework.stereotype.Controller"
type="annotation"/>
</context:component-scan>
MyApp-servlet.xml
<!-- Load @Controllers only -->
<context:component-scan base-package="com.myapp" use-default-filters="false">
<context:include-filter expression="org.springframework.stereotype.Controller"
type="annotation"/>
</context:component-scan>
EDIT:
Удаление <context:component-scan>
из myapp-config.xml
означает, что все ваши автоматически обнаруженные аннотированные bean-компоненты зарегистрированы в контексте DispatcherServlet
(то есть в контексте, загруженном из myapp-servlet.xml
).
Однако рекомендуемый подход состоит в том, чтобы использовать контекст сервлета для специфичных для представления вещей (таких как контроллеры), и использовать корневой контекст (myapp-config.xml
) для основных служб вашего приложения. Приведенное выше решение облегчает этот подход.
Что касается практических соображений, когда ваши основные службы помещаются в контекст приложения сервлета, к ним нельзя получить доступ вне области действия этого сервлета, например, из других сервлетов (вам может потребоваться использовать другие сервлеты для реализации другого). технологии доступа) или фильтры (такие как Spring Security
фильтры). Вот почему основные сервисы находятся в контексте корневого приложения.