Один из способов - создать фабричный класс и сохранить экземпляры bean-компонентов (каждый из которых реализует общий интерфейс MyBean
) в виде значений под некоторым ключом на карте (beans
):
public class MyBeanFactory {
private Map<Integer, MyBean> beans;
public MyBean create(Integer which) {
if (which != null)
return beans.get(which);
else
throw new IllegalArgumentException("Unknown bean");
}
public void setBeans(Map<Integer, MyBean> beans) {
this.beans = beans;
}
}
В вашей Spring applicationContext.xml
теперь создайте bean-компонент фабрики и установите bean-компоненты:
<beans...>
<bean id="myBeanFactory" class="foo.bar.MyBeanFactory">
<property name="beans">
<map>
<entry key="1">
<bean class="foo.bar.MyBeanA" />
</entry>
<entry key="2">
<bean class="foo.bar.MyBeanB" />
</entry>
</map>
</property>
</bean>
</beans>
Наконец, вы можете ввести фабрику bean-компонентов как обычно и получать экземпляры, например, вот так:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:/applicationContext.xml" })
public class MyBeanFactoryTest {
@Autowired
private MyBeanFactory myBeanFactory;
@Test
public void test() {
Assert.assertTrue(myBeanFactory.create(1) instanceof MyBeanA);
Assert.assertTrue(myBeanFactory.create(2) instanceof MyBeanB);
}
}