В @Service
я хочу включить два @Component
, скажем, ComponentA
и ComponentB
.
Оба этих компонента зависят от некоторого свойства (например, некоторой переменной среды; это означает, что эти компоненты не существуют, если эти переменные среды не установлены).
В сервисе есть и другие автозашитые бины, которые не являются обязательными. Учитывая, что я использую внедрение зависимостей конструктора, я не хочу создавать несколько конструкторов, а указываю 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
, я надеюсь добиться большего успеха, чем использование внедрения сеттера или внедрения поля. Возможно, что-то похожее...
public MainService(NonOptionalBean1 b1, NonOptionalBean2 b2,
..., @Optional ComponentA a, @Optional ComponentB b) { ... }