Похоже, что при использовании @Configurable (either compile or load time) if you have a class that has
@ Autowired context (see
aClass. javabelow) from 2 different context (
context1. xml,
context2. xml), the
@ Configurable` всегда сохраняются внутри предыдущей весны context.
, чтобы проиллюстрировать эту проблему. Я создал эти 3 модульных теста: Test1
, Test2
, test3
.
Если я буду запускать каждый тест по отдельности, я не получу ошибок.
, но если я запускаю 3 теста в наборе, Test3
завершится неудачно с ошибкой "Не определен bean-компонент с именем 'bean1'", но он должен работать так, как настроено в context1. xml
Есть ли способ обойти эту проблему и попросить Spring переназначить классы @configurable
в правильном контексте, не помечая тест как грязный?
Я получаю эту проблему в интеграционном тесте пакет, и загрузка этого контекста занимает около 1 минуты, поэтому его загрязнение после каждого теста неприемлемо
springContextTest/context1.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:annotation-config />
<context:component-scan base-package="common.springContextTest"/>
<context:spring-configured/>
<context:load-time-weaver />
<bean id="bean1" class="java.lang.String">
<constructor-arg type="java.lang.String" value="hello"/>
</bean>
</beans>
springContextTest/context2.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">
<context:annotation-config />
<context:component-scan base-package="common.springContextTest"/>
<context:spring-configured/>
<context:load-time-weaver />
<bean id="bean2" class="java.lang.String">
<constructor-arg type="java.lang.String" value="hello2"/>
</bean>
</beans>
springContextTest/AClass.java
package springContextTest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.ApplicationContext;
@Configurable(preConstruction = true)
public class AClass {
@Autowired
public ApplicationContext appContext;
public String getBean(String beanName){
return (String) appContext.getBean(beanName);
}
}
springContextTest/Test1.java
package springContextTest;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context1.xml"})
public class Test1 {
@Autowired
private ApplicationContext appContext;
@Test
public void name() {
AClass aClass = new AClass();
Assert.assertEquals("hello",aClass.getBean("bean1"));
}
}
springContextTest/Test2.java
package springContextTest;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context2.xml"})
public class Test2 {
@Test
public void name() {
AClass aClass = new AClass();
Assert.assertEquals("hello2",aClass.getBean("bean2"));
}
}
springContextTest/Test3.java
package springContextTest;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"context1.xml"})
public class Test3 {
@Autowired
public ApplicationContext appContext;
@Test
public void name() {
AClass aClass = new AClass();
//aClass.appContext =appContext;
Assert.assertEquals("hello",aClass.getBean("bean1"));
}
}