使用条件Bean自动装配构造函数

时间:2019-07-16 20:48:51

标签: java spring dependency-injection inversion-of-control

@Service中,我想包括两个@Component,例如ComponentAComponentB

这两个组件都取决于某些属性(例如,某些环境变量;这意味着如果未设置这些环境变量,则这些bean不存在)。

该服务中还有其他一些自动接线的bean,它们不是可选的。鉴于我正在使用构造函数依赖项注入,所以我不想创建多个构造函数,而是指示Spring在实例化我的服务时使用null。以下作品:

public MainService(NonOptionalBean1 b1, NonOptionalBean2 b2,
                   ..., ComponentA a, ComponentB b) { ... }
public MainService(NonOptionalBean1 b1, NonOptionalBean2 b2,
                   ..., ComponentA a) { ... }
public MainService(NonOptionalBean1 b1, NonOptionalBean2 b2,
                   ..., ComponentB b) { ... }
public MainService(NonOptionalBean1 b1, NonOptionalBean2 b2,
                   ...) { ... }

但这需要创建四个构造函数,具体取决于存在多少条件Bean(都不是,确切是一个)。这行得通,但是在一般情况下,需要数量成倍的构造函数-我只能假设有更好的方法。

鉴于田间注射的弊端,以及我希望保留注射的豆final的愿望,我希望比使用setter注射或田间注射做得更好。也许,看起来像...

public MainService(NonOptionalBean1 b1, NonOptionalBean2 b2,
                   ..., @Optional ComponentA a, @Optional ComponentB b) { ... }

1 个答案:

答案 0 :(得分:1)

您可以在Spring中使用Optional<YourOptionalBean>。它可以与构造函数注入一起使用。