Можно ли внедрить контекст в другой контекст?

Может быть, вопрос не так ясен, но на примере, я думаю, я проясню это. В моем проекте есть два вида тестов: интеграционные и сценарные. Им обоим нужен источник данных (с пользовательским заполнителем свойств).

В контексте теста интеграции определите только источник данных и заполнитель, например:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
    <property name="driverClassName" value="${db.driver}" />
    <property name="url" value="${db.url}" />
    <property name="username" value="${db.username}" />
    <property name="password" value="${db.password}" />
</bean>

<bean id="propertyResolver" class="com.cegeka.bibliothouris.test.MultiThreadedPropertyResolver">
    <property name="location"><value>classpath:testContext.properties</value></property>
</bean>

В моем контексте тестового сценария мне также нужны эти объекты (вместе с некоторыми другими вещами), но я просто хочу создать контекст интеграции «в» моем контексте сценария, поэтому какое-то наследование.

Я уже пробовал это с classPathApplicationContext в своем тестовом примере сценария (один раз с lazy-init на true), например так:

<bean class="org.springframework.context.support.ClassPathXmlApplicationContext">
    <constructor-arg>
        <list>
            <value>classpath:overridingTestContext.xml</value>
        </list>
    </constructor-arg>
</bean>

Но он не создает dataSource в контексте сценария. Это проблема, которую очень сложно найти в Google, поэтому я спрашиваю ее здесь. Я надеюсь, что у кого-то есть решение.


person Walle    schedule 13.05.2011    source источник
comment
Почему вы хотите сделать это таким сложным (два контекста)? Почему бы вам просто не сослаться на конфигурацию тестового примера интеграции из конфигурации тестового примера secenario и не построить один контекст?   -  person Ralph    schedule 13.05.2011
comment
Я не знаю, что вы имеете в виду, я новичок в Spring, но для теста сценария необходимо запустить seleniumserver, seleniumhost и jettyserver, а для теста интеграции - нет. Так что нет необходимости запускать все эти вещи, когда я запускаю интеграционный тест. И если есть потребность в каком-то третьем тесткейсе, который также должен использовать источник данных, я могу импортировать его и туда.   -  person Walle    schedule 13.05.2011
comment
То, что Йохан Сьоберг описал в своем ответе, - это способ построить ОДИН контекст приложения из двух файлов конфигурации. контекст). То, что вы задали в своем вопросе (или то, что я понял, что вы пытаетесь) было немного другим, вы пытались иметь два разных контекста, в которых один может использовать другой (немного похоже на веб-контекст и контекст приложения). -- В любом случае: ответ Йохана Шёберга - это то, что я бы порекомендовал.   -  person Ralph    schedule 13.05.2011


Ответы (1)


Spring может комбинировать несколько контекстов приложений и предоставляет модель, подобную наследованию, позволяя использовать только один компонент с одним и тем же идентификатором. Если два bean-компонента имеют один и тот же идентификатор, последний переопределит первый.

Следовательно, вы можете просто импортировать нужные вам конфигурации в правильном порядке, используя, например,

<import resource="context.xml" />

Однако поведение зависит от значения setAllowBeanDefinitionOverriding, который по умолчанию равен true.

Отвечает ли это на ваш вопрос?

person Johan Sjöberg    schedule 13.05.2011
comment
Думаю, мне просто нужно поместить его между другими бобами? Я сделал это: ‹import resource=classpath:overridingTestContext.xml/›, но он все еще не может найти источник данных... - person Walle; 13.05.2011
comment
Насколько я понимаю, spring полностью анализирует один файл конфигурации перед следующим, поэтому не имеет значения, поместите ли вы оператор импорта между двумя bean-компонентами. Также убедитесь, что вы указали правильный путь к ресурсу (например, с помощью весны отладочной регистрации с помощью log4j). - person Johan Sjöberg; 13.05.2011
comment
Хм, кажется, я нашел проблему. Помимо контекста интеграции и контекста сценария, мои тестовые примеры также должны внедрять контекст приложения. Он не может найти источник данных не в контексте сценария, а в контексте приложения. Что на самом деле очень странно, потому что это работает, когда я запускаю интеграционный тест, и не работает, когда я запускаю сценарный тест. - person Walle; 13.05.2011