Весна: хорошо иметь два контекста - веб и бэкэнд? - PullRequest
3 голосов
/ 21 июня 2010

У меня есть веб-приложение на основе пружин с бэкэндом на основе пружин. В настоящее время интеграция выполняется глупым образом, вручную копируя бэкэнд .xml в ресурсы веб-приложения и объединяя его.

Мне было интересно, готов ли Spring иметь боб, который был бы другим ApplicationContext, и может ли он получить бобы из него; также, если он обрабатывает конфликты имен бинов - например, если я могу назначить пространство имен для «импортированных» бобов.

Или - какова лучшая практика для этого случая?

Спасибо, Ондра.

Ответы [ 3 ]

2 голосов
/ 21 июня 2010

Я всегда разделяю свой Spring XML по слоям: сеть, сервис, постоянство.Это никогда не только в одном файле.Я бы сказал, что делать это не по себе;это лучшая практика.

2 голосов
/ 21 июня 2010

По умолчанию у вас уже должно быть два контекста.Контекст, названный в честь вашего сервлета ([servlet-name] -context.xml), является WebApplicationContext и является дочерним контекстом основного ApplicationContext, который создается из файлов, перечисленных в contextConfigLocation, и загружается ContextLoaderListener.Дочерний может получить доступ к любым bean-компонентам, определенным в родительском объекте, но родитель не имеет доступа к bean-компонентам, определенным в дочернем компоненте, поэтому имейте это в виду, прежде чем начинать перемещать bean-компоненты.

Я сохраняю только веб-конфигурацию в WebApplicationContext - мои контроллеры и представления и тому подобное.Все, что не относится к сети, попадает в основной ApplicationContext, который сам по себе всегда представляет собой один файл, который просто импортирует ряд других XML-файлов контекста приложения, разбитых по слоям, как это предлагают другие.

<import resource="classpath:dao-context.xml" />
<import resource="classpath:service-context.xml" />
<import resource="security-context.xml" />

Обратите внимание, что Spring допускает только один элемент property-placeholder в каждом контексте приложения, но вы также можете иметь его в каждом дочернем контексте приложения, поэтому мой файл [servlet-name] -context.xml всегда имеет свойство-placeholderсо специфичными для веб-сайта свойствами конфигурации, а основной контекст приложения имеет другой контекст, который я обычно определяю прямо в файле верхнего уровня, перед всем импортом.

1 голос
/ 21 июня 2010

Если я вас правильно понял, это определенно нормально.Некоторые люди разделяют свои контексты базы данных с их веб-контекстами.Пример ниже в вашем web.xml:

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        classpath:someApplicationContext.xml
        classpath:someOtherApplicationContext.xml
    </param-value>
</context-param>

<listener>
    <listener-class>
        org.springframework.web.context.ContextLoaderListener
    </listener-class>
</listener>

Что касается столкновения бинов - вы должны дать бобам уникальный идентификатор.

...