相当于 Spring Boot 中用于动态注入的 javax.enterprise.inject.Instance

问题描述 投票:0回答:3

我正在将代码从 JEE 迁移到 SpringBoot。我在 JEE 中使用酷动态注入和 javax.enterprise.inject.Instance 类:

只是注释:

@Inject
private Instance<CCIntentHandler> allMycandidates;

将使 allMycandidates 充满我的类路径中继承 CCIntentHandler 接口的所有类,然后我可以简单地迭代:

Iterator<CCIntentHandler> iterator = allMycandidates.iterator()

没有更多的需要。我怎样才能在 Spring Boot 中实现这一点?

谢谢

java spring-boot dependency-injection cdi
3个回答
4
投票

Spring 将注入

Foo
的所有实例,如果您
@Autowire
a
List<Foo>
.

所以,Spring 相当于 ...

@Inject
private Instance<CCIntentHandler> allMycandidates;

...是:

@Autowire
private List<CCIntentHandler> allMycandidates;

更新 1 以回应此评论:

CCIntentHandler 接口或实现该接口的类是否需要任何 Spring 注释?

Spring 必须知道

CCIntentHandler
的任何实例,这可以通过以下方式实现:

  • CCIntentHandler
    注释每个实现
    @Component
    的类,并确保这些类被Spring Boot扫描

  • 提供一个公共方法来返回每个实现
    CCIntentHandler
    的类并用
    @Bean
    注释每个公共方法并确保包含这些公共方法的类用
    @Configuration
    注释并且这个配置类由Spring Boot扫描.

有关 bean 声明和依赖注入的更多详细信息在文档中.


0
投票

不幸的是

@Autowire
private List<CCIntentHandler> allMycandidates;

不是

@Inject
private Instance<CCIntentHandler> allMycandidates;

因为我们无法根据类型或注释从列表中选择实例。

我花了一些时间在 Spring 中寻找替代方案,但看起来没有等价物......

我们应该 defenetly 将该功能带到 Spring 中!


0
投票

另外,我的答案可能会在 1.5 年后出现,但实际上 Spring 中也有一个实例版本,也称为 ObjectProvider。

意味着在你的情况下它会是

@Autowire
private ObjectProvider<CCIntentHandler> allMycandidates;

您可以迭代所有具有该类型的 bean 作为实现 Iterable,还支持流(通过

Stream<T> stream()
),但还有一些其他方法。

© www.soinside.com 2019 - 2024. All rights reserved.