Есть ли в Spring DI механизм отката?

Есть ли в Spring DI механизм отката?
Под вышеизложенным я подразумеваю, что если создание экземпляра компонента A по какой-то причине невозможно, то можно ли создать экземпляр компонента B и автоматически связать его.

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


person samshers    schedule 31.08.2020    source источник
comment
Отвечает ли это на ваш вопрос? Реализация резервного компонента Spring   -  person Daniel Jacob    schedule 31.08.2020
comment
Было бы хорошо описать ваши конкретные причины, которые могут сделать невозможным создание экземпляра A.   -  person Steven    schedule 31.08.2020


Ответы (2)


Вы можете использовать @Autowired(required = false) для классов A и B и проверить в методе @PostConstruct, инициализированы ли A или B. Но я не знаю никакого механизма, позволяющего использовать @Autowired только в случае сбоя другого @Autowired.

person Milgo    schedule 31.08.2020

Вы должны разделить понятия создания экземпляра компонента и автоматического связывания.

Если класс A, определенный как компонент (например, путем помещения в него @Component), не может быть создан по какой-либо причине, контекст приложения не запустится, и точка. Это независимо от зависимостей самого компонента.

Теперь, если у вас есть bean-компоненты A, bean-компоненты B и bean-компоненты C, у которых есть два кандидата на автоматическое связывание, то это выглядит так:

public interface I {}

@Component
public class A implements I {}

@Component
public class B implements I {}

@Component
public class C {
   @Autowired  
   private I i;
}

В этом случае экземпляр класса C не будет создан, и весь контекст приложения потерпит неудачу, потому что Spring не будет знать, какую реализацию вам придется использовать в классе C (два кандидата для автоматического подключения).

В этом случае вам нужно дать подсказки Spring:

  • с помощью аннотации @Primary
  • с помощью аннотации @Qualifier

Таким образом, чтобы завершить процесс инициализации контекста приложения, он должен быть детерминированным и четко определенным.

person Mark Bramnik    schedule 31.08.2020