我正在将代码从 JEE 迁移到 SpringBoot。我在 JEE 中使用酷动态注入和 javax.enterprise.inject.Instance 类:
只是注释:
@Inject
private Instance<CCIntentHandler> allMycandidates;
将使 allMycandidates 充满我的类路径中继承 CCIntentHandler 接口的所有类,然后我可以简单地迭代:
Iterator<CCIntentHandler> iterator = allMycandidates.iterator()
没有更多的需要。我怎样才能在 Spring Boot 中实现这一点?
谢谢
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 声明和依赖注入的更多详细信息在文档中.
不幸的是
@Autowire
private List<CCIntentHandler> allMycandidates;
不是
@Inject
private Instance<CCIntentHandler> allMycandidates;
因为我们无法根据类型或注释从列表中选择实例。
我花了一些时间在 Spring 中寻找替代方案,但看起来没有等价物......
我们应该 defenetly 将该功能带到 Spring 中!
另外,我的答案可能会在 1.5 年后出现,但实际上 Spring 中也有一个实例版本,也称为 ObjectProvider。
意味着在你的情况下它会是
@Autowire
private ObjectProvider<CCIntentHandler> allMycandidates;
您可以迭代所有具有该类型的 bean 作为实现 Iterable,还支持流(通过
Stream<T> stream()
),但还有一些其他方法。