我需要将已经初始化的 bean 列表注入到另一个中。
我有一些懒惰豆的定义,这些懒惰的豆子根据环境使用-例如仅在服务器1上impl1
并且将使用impl2
,而在服务器2上impl3
和impl1
@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"。