Могу ли я заставить Spring снабжать конструкторы @Autowired нулями, пока Bean отключен? - PullRequest
0 голосов
/ 20 декабря 2018

Я разрабатываю новую функцию, которая должна быть скрыта за FeatureToggleX.Как часть этого, мне нужно добавить новую зависимость b к моему SomeClass:

class SomeClass {

  private OldDependency a;
  private NewDependency b;

  @Autowired
  public SomeClass(OldDependency a, NewDependency b) {
    this.a = a;
    this.b = b;
  }

}

Я использую пользовательскую аннотацию IfActive в качестве Conditional, которая служит TheToggledDependency, если итолько если FeatureToggleX активен:

@Component
@IfActive("FeatureToggleX")
class TheToggledDependency implements NewDependency {
}

Как сделать пружину временно подключенной b = null, когда FeatureToggleX выключен?

Есть липростой способ подключить универсальное решение к процессу проводки Spring, который обнаруживает IfActive компоненты и расходные материалы null s на своих местах?


  • Как рекомендуется в других ответах, я рассмотрел @Autowired(required = false) - возможно, в сочетании с перегрузкой конструктора SomeClass - чтобы разрешить пропуск b, но это побочный эффект, который также узаконивает пропуск a, что должно быть ошибкой.

  • Я мог бы предоставить альтернативный макет IfInactive вариант NewDependency, но это наполнило бы мой проект бесполезными манекенами, которые мне нужно помнить, удаляя при удалении переключателя.

  • Точно так же я мог бы построить два варианта SomeClass, одину него есть NewDependency и секунда, о которой он совершенно не знает, и выбирайте между двумя в зависимости от переключателя.Однако это нецелесообразно для больших классов, поскольку дублирует другие незатронутые функции.

1 Ответ

0 голосов
/ 20 декабря 2018

Нет, по крайней мере, не в конструкторе.Один из способов справиться с подобными вещами - это инъекция сеттера.

Так что у вас будет что-то вроде этого (утка) здесь:

class SomeClass {


  private OldDependency a;
  private NewDependency b;

  @Autowired
  public SomeClass(OldDependency a) {
    this.a = a;
  }

  @Autorired(required=false)
  public void setNewDependency(NewDependency b) {
   this.b = b;
  }

}

Надеюсь, это поможет.

...