注入初始化的 bean 列表



我需要将已经初始化的 bean 列表注入到另一个中。

我有一些懒惰豆的定义,这些懒惰的豆子根据环境使用-例如仅在服务器1上impl1并且将使用impl2,而在服务器2上impl3impl1

@Component
class Definitions {
    @Bean
    @Lazy
    public A impl1() { /* ... */ }
    @Bean
    @Lazy
    public A impl2() { /* ... */ }
    @Bean
    @Lazy
    public A impl3() { /* ... */ }
}

我有一些监测豆,它对环境一无所知,只是收集所有这些A豆,为执行器暴露一些健康信息:

@Component
class Monitoring implements HealthIndicator {
    @Autowired
    private List<A> monitored;
}

问题是 spring 将所有 bean 连接到monitored即使它们之前没有初始化(这会崩溃整个事情,因为没有合适的环境(。我需要以某种方式向春天解释我只需要已经初始化的豆子 - 类似于@AutowireOnlyThoseLazyBeansWhichAlreadyBeenUsedSomewhereElse

附言我知道我可以使用 dirty hack 并在 Definitions 中声明一个列表属性,在 bean factory 方法中填写它并引用该列表注册另一个 bean,但它太脏了。

解决方案是通过 BeanPostProcessor 监控某种特定类型的 bean,并将并发映射中所有跟踪的 bean 注册到上下文中,从而编写类似于 OSGi 的自定义"ServiceTracker"。

最新更新