java - 我可以通过扫描 spring 配置文件中的 beans 来动态创建一个列表吗?

标签 java spring

例如,我在我的 Spring 配置中创建了一系列“test-my-service”对象,每个对象都有与人为测试场景相关的数据。目前,每次我想运行新场景或场景列表时,我都在手动编辑 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); 
     }
}

最佳答案

您可以使用 ListableBeanFactory 接口(interface)检索所有 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().

注入(inject)的 ListableBeanFactory 将成为“当前”应用程序上下文。

关于java - 我可以通过扫描 spring 配置文件中的 beans 来动态创建一个列表吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3808048/

相关文章:

java - Swing 覆盖对象的 paintComponent

java - 计算Excel工作表一列中的行数(提供Java代码)

java - 如何在 spring-data 中使用 CrudRepository 强制预加载?

java - @Autowired-ing DAO 时出现 ValidationException

java - 使用 hibernate 的spring mvc中的流未发送到 Controller

java - Spring 中的嵌套 Thymeleaf 模板

java - 我将如何向弹出菜单添加单选按钮?

java - 通过重构简化代码

java - 如何在 Java EE 中注入(inject)外部定义的类

java - 尝试将邮件发送到电子邮件地址列表(其中的电子邮件 ID 无效)时出错