代码之家  ›  专栏  ›  技术社区  ›  bakoyaro CoreyRDean

我可以通过扫描Spring配置文件中的bean动态创建一个列表吗?

  •  3
  • bakoyaro CoreyRDean  · 技术社区  · 14 年前

    例如,我在我的Spring配置中创建了一系列“测试我的服务”对象,并且每个对象都有与人为的测试场景相关的数据。目前,每当我想要运行一个新的场景或场景列表时,我都会手动编辑Spring配置。有没有一种方法可以为bean名称添加前缀,然后将具有该前缀(或后缀)的所有bean加载到列表或数组中?比如……

    <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); 
         }
    }
    
    2 回复  |  直到 14 年前
        1
  •  14
  •   skaffman    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() .

    注入的 可列出的BeanFactory 将是“当前”应用程序上下文。

        2
  •  2
  •   Rodney Gitzel    14 年前

    我以前从未尝试过,但看起来您可以从上下文中获得所有bean的列表: http://static.springsource.org/spring/docs/2.0.x/api/org/springframework/beans/factory/ListableBeanFactory.html#getBeanDefinitionNames%28%29

    从这一点来看,筛选名称并加载匹配项并不困难。