Я работаю над веб-приложением Spring MVC, использующим HTTP-сервер Jetty, который содержит WebAppContext
<bean id="Server" class="org.mortbay.jetty.Server" init-method="start"
destroy-method="stop">
<property name="connectors">
<list>
<bean id="Connector" class="org.mortbay.jetty.nio.SelectChannelConnector">
<property name="port" value="9531" />
</bean>
</list>
</property>
<property name="handler">
<bean id="handlers" class="org.mortbay.jetty.handler.HandlerCollection">
<property name="handlers">
<list>
<bean id="contexts" class="org.mortbay.jetty.handler.ContextHandlerCollection">
<property name="handlers">
<list>
<bean class="org.mortbay.jetty.webapp.WebAppContext">
<property name="contextPath" value="/" />
<property name="war" value="/etc/WebContent" />
<!-- <property name="copyWebDir" value="true" /> -->
</bean>
</list>
</property>
</bean>
</list>
</property>
</bean>
</property>
</bean>
Я пытаюсь выяснить, где бобы должны быть определены. В основном есть два варианта: мой конфигурационный файл Spring для моего приложения (назовите его «myApp-context.xml») или конфигурационный файл Spring сервлета (назовите его «myApp-servlet.xml»). Соответствующий раздел из файла web.xml:
<servlet-mapping>
<servlet-name>myApp</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:jeff/myApp-context.xml</param-value>
</context-param>
Пока все хорошо. Основываясь на других связанных вопросах / ответах, я помещаю в myApp-servlet.xml такие вещи, как средства разрешения моего представления Spring MVC (которые непосредственно связаны с веб-приложением), а другие компоненты, специфичные для приложений, такие как DAO, утилиты предоставления прав и т. Д., В myApp-. context.xml (который задан как «contextConfigLocation» в web.xml). Это работает нормально, приложение запускается, и все вводится правильно, контроллеры Spring MVC работают нормально и т. Д.
Однако я заметил, что любые bean-компоненты, определенные в myApp-servlet.xml (которые, согласно соглашению, должны существовать в корневом каталоге Интернета, учитывая, что мое имя сервлета "myApp") загружаются Spring дважды. В частности, есть сообщение журнала, подобное «Инициализация Spring FrameworkServlet« myApp »», после чего все компоненты bean, которые были в myApp-servlet.xml, загружаются снова.
Если я переместлю все эти bean-компоненты из myApp-servlet.xml в myApp-context.xml, оставив myApp-servlet.xml пустым (просто открывая и закрывая теги), приложение запускается успешно (на этот раз быстрее) и не создайте каждый боб дважды.
Тем не менее, похоже, что WebAppContext в Jetty настаивает на наличии файла myApp-servlet.xml (если он не существует, приложение не запускается). Это также требует, чтобы contextConfigLocation был определен и указывал на действительный конфигурационный файл Spring.
Может кто-нибудь помочь мне разобраться в моей конфигурации? Оставлять myApp-servlet.xml без какого-либо определения bean-компонента кажется правильным, потому что приложение запускается быстрее и без избыточной инициализации bean-компонента, но неправильно, потому что контекст веб-приложения требует его существования. Помещение некоторых bean-компонентов в myApp-servlet.xml кажется правильным, потому что в противном случае оно было бы пустым, но неправильным, потому что теперь эти bean-компоненты инициализируются дважды, запуск занимает больше времени, и выбор того, какие bean-компоненты поместить туда, кажется произвольным. Спасибо за любую помощь, и дополнительные детали / фрагменты могут быть предоставлены по мере необходимости.
Редактировать : теперь мне ясно, почему эти двое различны. myApp-servlet.xml - это конфигурационный файл Spring для конкретного сервлета. Поэтому, если этот сервлет является сервлетом Spring MVC, в этот файл следует поместить контроллеры и т. Д. Можно также иметь myApp2-servlet.xml и myApp3-servlet.xml, определяя два других сервлета в одном контейнере. Все они, естественно, будут иметь компоненты, независимые друг от друга (поскольку они являются полностью отдельными веб-приложениями).
С другой стороны, файл myApp-context.xml содержит определения bean-компонентов, которые будут предоставляться каждому сервлету. Вот почему утилиты БД, права и т. Д., Как указала Неэме Пракс, должны быть в этом файле. Вполне вероятно, что каждое веб-приложение, будучи совершенно отдельным по своей презентации и функциям, должно будет использовать некоторые общие утилиты. Это место для определения тех «обычных» бобов.