例如,我在Spring配置中创建了一系列'test-my-service'对象,每个Object都有关于人为测试场景的数据。目前,每次我想运行新场景或场景列表时,我都会手动编辑Spring配置。有没有办法可以为bean名称添加前缀,然后将带有该前缀(或后缀)的所有bean加载到List或Array中?像......那样......
<bean name="env1-test1"/>
<bean name="env2-test1"/>
这是我写完的代码。我无法从之前接受的示例中初始化beanFactory对象:
String[] beanNames = context.getBeanNamesForType(Inputs.class);
for (String beanName : beanNames) {
if (beanName.startsWith("env")) {
System.out.println("Found a bean of type " + Inputs.class.getName());
Inputs bean = (Inputs)context.getBean(beanName);
doTest(bean);
}
}
答案 0 :(得分:14)
您可以使用ListableBeanFactory
接口检索所有bean名称,然后加载您感兴趣的名称:
private @Autowired ListableBeanFactory beanFactory;
public void doStuff() {
for (String beanName : beanFactory.getBeanDefinitionNames()) {
if (beanName.startsWith("env")) { // or whatever check you want to do
Object bean = beanFactory.getBean(beanName)
// .. do something with it
}
}
}
或者,如果目标bean的类型相同,那么您可以使用ListableBeanFactory.getBeansOfType()
或ListableBeanFactory.getBeanNamesForType()
按类型而不是按名称请求所有目标bean。
注入的ListableBeanFactory
将是“当前”应用程序上下文。
答案 1 :(得分:2)
我以前从未尝试过,但看起来你可以从上下文中获取所有bean的列表:http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/beans/factory/ListableBeanFactory.html#getBeanDefinitionNames%28%29
从那里过滤名称并加载匹配并不困难。