【发布时间】:2019-03-08 07:52:27
【问题描述】:
说我有:
interface A { ... }
class A1 implements A { ... }
class A2 implements A { ... }
@Lazy
@Configuration
class SpringConfig {
@Bean
A a1(DepA11 depA11, DepA12 depA12, ...) {
}
@Bean
A a2(DepA21 depA21, DepA22 depA22, ...) {
}
}
现在假设有一些复杂的逻辑依赖于一些返回 int 的注入依赖项:
int choose(DepChoose1 depChoose1, DepChoose2 depChoose2, ...) {
// Complex logic that depends on depChoose1, depChoose2, ...
int res = ...;
return res;
}
我希望 Spring 根据返回值自动装配 a1 或 a2。
必须不要实例化另一个 bean(或一般的 bean - 我们可以有 a3、a4、...),因为它们中的每一个都会在启动时产生繁重的处理,并且还会产生副作用如果最初要选择另一个 bean,则必须避免这种情况。
A1 和A2 是供系统其他部分使用的类似流的项目源。它们的一些(非直接)依赖项通过@PostConstruct 进行了初始化。
它们的依赖也是基于推送的。无论他们获取什么,他们都会推送到B,然后转发给其他消费者。因此,仅初始化它们会产生不必要的推送。
我想过使用@Conditional,但它是inherently doesn't support dependencies。
在 Spring 中是否有一种简洁的方法可以做到这一点?
【问题讨论】: