说我有
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(或一般来说,我们可以有a3
,a4
,...的bean),因为每个bean都会在启动时进行繁重的处理,并且如果要最初选择另一个bean,则有一些副作用必须避免。
A1
和A2
是类似流的项源,供系统其他部分使用。他们的一些(不是直接的)依赖项通过@PostConstruct
进行了初始化。
它们的依赖项也是基于推送的。无论获取什么,它们都会推送到B
,然后转发给其他使用者。因此,仅对它们进行初始化会产生不必要的推送。
我考虑过使用@Conditional
,但是它是inherently doesn't support dependencies。
在Spring中有一种简洁的方法吗?
答案 0 :(得分:1)
也许不是您要找的解决方案,但是如果实例化(未使用的)bean的成本太高,请实例化工厂。
答案 1 :(得分:1)
两种可能性:
choose
始终返回相同的值,也就是说,您始终希望在上下文中使用a1
或a2
,则只需定义一个@Bean
方法,在其中执行检查并从中返回a1
或a2
choose
返回不同的值,则创建一个将充当工厂的新bean,因此您无需注入a1
或a2
,而是注入工厂,然后调用例如。 getBean()
,然后将调用choose
并返回a1
或a2