我想在集成测试中使用spring注释来使用不同的applicationContexts加载同一对象的不同实例(但使用相同的配置xml)。下面是一个代表我的问题的简单示例:
我的junit测试看起来像这样:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{
@Autowired
Car car1;
@Autowired
Car car2;
@Test
public void test()
{
car1.displayParts();
car2.displayParts();
}
}
我的汽车课:
@Component
@Scope(value = BeanDefinition.SCOPE_PROTOTYPE)
public class Car
{
@Autowired
private ElectricalSystem electricalSystem;
@Autowired
private Alternator alternator;
public void displayParts()
{
System.out.println("Parts for car: " + this.toString());
System.out.println(electricalSystem.toString());
System.out.println(alternator.toString());
}
public void raceQuarterMile()
{
}
}
ElectricalSystem类:
@Component
public class ElectricalSystem
{
@Autowired
private Alternator alternator;
}
交流发电机类:
@Component
public class Alternator
{
}
CarContext.xml的内容
<context:component-scan base-package="springTest"/>
从单个汽车的示例中可以看出,交流发电机可能被多个其他组件/系统引用 - 所有这些都需要引用单个实例。然而,对于我的集成测试来说,两辆车相互对抗,我需要每辆车都有自己的应用环境,所以每辆车都有不同的交流发电机。
这是我获得上述代码的输出:
Parts for car: springTest.Car@3ea20bc2
springTest.ElectricalSystem@b20dae
springTest.Alternator@29a01add
Parts for car: springTest.Car@4e43b884
springTest.ElectricalSystem@b20dae
springTest.Alternator@29a01add
请注意我的两辆车如何拥有完全相同的电气系统和交流发电机 - 而不是我想要的。
使用带有两个不同应用程序上下文的context.getBean,我已经能够按预期使用以下Junit工作:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:CarContext.xml")
public class CarRaceTest
{
private String contextFile = "classpath:CarContext.xml";
private ApplicationContext appContext1;
private ApplicationContext appContext2;
Car car1;
Car car2;
public CarRaceTest()
{
this.appContext1 = new FileSystemXmlApplicationContext(this.contextFile);
this.appContext2 = new FileSystemXmlApplicationContext(this.contextFile);
}
@Test
public void test()
{
car1 = appContext1.getBean(Car.class);
car2 = appContext2.getBean(Car.class);
car1.displayParts();
car2.displayParts();
}
}
使用以下输出:
Parts for car: springTest.Car@247de4f1
springTest.ElectricalSystem@45419cee
springTest.Alternator@56a5f0c7
Parts for car: springTest.Car@2862c542
springTest.ElectricalSystem@6c8484c4
springTest.Alternator@70289784
如何在不调用.getbean()的情况下使用注释完成相同的结果?
答案 0 :(得分:1)
你是对的 - Spring无法将你的实例级别引用与具有字段访问器的新引用交换;它由@Autowired
注释设置一次,然后所有内容都只引用该字段的单例。我相信您的问题可以使用Spring的lookup-method
属性来解决,在这里举例说明:Java code geeks