当前位置: 首页 > 知识库问答 >
问题:

在@configuration中注入bean的合并列表

臧翰采
2023-03-14
interface Basic { void foo(); }
interface Extended extends Basic { void bar(); }

class BasicService {
  @Inject
  List<Basic> basics;

  void execute() {
    basics.forEach(Basic::foo);
  }
}

class ExtendedService {
  @Inject
  List<Extended> extendeds;

  void execute() {
    extendeds.forEach(Extended::bar);
  }
}

@Configuration
class MyConfiguration {
  // Assume, that Basic1 and Basic2 are implementations of Basic and
  // Extended1 is an implementation of Extended
  @Bean
  public Basic basic1() {
    return new Basic1();
  }
  @Bean
  public Basic basic2() {
    return new Basic2();
  }
  @Bean
  public List<Extended> extendeds() {
    return Arrays.asList(new Extended1("0"), new Extended1("1"), new Extended1("2"));
  }

  @Bean
  public BasicService basicService() {
    return new BasicService();
  }
  @Bean
  public ExtendedService extendedService() {
    return new ExtendedService();
  }
}

共有1个答案

冯星阑
2023-03-14

我不确定是否有一种方法可以隐式地解决这个问题,因为Spring试图找到最佳匹配,而List bean似乎就是这样(您是否尝试过泛型,例如List<?extends basic>?)。

但是您可以通过从ApplicationContext中获取bean定义,以编程方式进行:

public BasicService(@Inject ApplicationContext ctx) {
    Map<String, ? extends Basic> basicMap = ctx.getBeansOfType(Basic.class);
    Map<String, Collection<? extends Basic>> basicCollectionMap = ctx.getBeansofType(ResolvableType.forClassWithGenerics(Collection.class, Basic.class));

    // Now merge
    Collection<? extends Basic> basics = basicMap.values();
    basicCollectionMap.values().stream().map(l -> basics.addAll(l));
}

我只是在这里输入了这个,所以我希望没有任何明显的错误。

 类似资料:
  • 我有一个Spring bean,在Spring Bean中我有一个对其他bean列表的依赖项。我的问题是:如何注入一个通用的bean列表作为该bean的依赖项? 例如,一些代码: 我的豆子: 问题是:;如何在Painter中获得颜色列表?另外,还有一点:我应该让@Configuration返回接口类型还是类? 谢谢你的帮助!

  • 我有两节课 还有一个雇员类 在我的控制器中,我从服务层检索数据,并尝试填充部门。这就是我的控制器的样子。 过去,如果我使用new关键字为CDI管理的bean构造实例,我会遇到麻烦。我可以使用new创建一个ArrayList,使用new构造Employee实例,将它们添加到列表中,然后在departmentbean中设置列表。有人能告诉我在ManagedBean部门填充员工(ManagedBean)

  • Spring在这里需要一些帮助。在我们的项目中,我们使用XML和注释配置(Spring 4.1) 最近我遇到了以下任务: 我有一个范围原型的bean列表,它们都实现了相同的接口。 此外,我有一个单独的bean,它有< code>execute方法。在方法内部,bean应该访问这些原型bean的列表。 每次执行“execute”方法时,我都想访问这些原型bean的不同实例)。在singleton中,

  • 问题内容: 我有一个代码: 我期望一旦启动应用程序BeanSample.getSomeBean(),然后SomeBean将开始由“ someBean”提供。 现在我有一个错误: 没有定义名为“ someBean”的bean 实际上,我有点不明白应该使用哪个应用程序上下文来提取我的豆子? 关于@Configuration : 有什么原因,为什么我应该在这里使用@Configuration注释?(通过

  • 我有一个属性类: 我在@Configuration类中启用配置属性,如下所示: 在同一个类(“SomeAutoConfiguration”)中,我想创建另一个bean,具体取决于SomeProperties中的list属性是否为空。我想我可以将@ConditionalExpression与以下SpEl结合使用: SpEl是正确的,但我无法获得包含我的属性的bean。使用上面的表达式,我遇到了 EL

  • 问题内容: 我有一个会话范围的bean 我在一个过滤器中注入了对象… 但是,我在下一次交互中融合了SessionBean … 但是该属性返回null 我通过CDI注释更改了导入,但仍然无法使用(),与JSF注释(和)相同。 谢谢。 PD:对不起,我的英语! 问题答案: 您不能将用于JSF和CDI的这两个包中的注释混合在一起。两者都反映了不同的注入机制,因此不能在同一bean上混合使用。您必须从同一