Разница между внедрением зависимостей и @DependsOn - PullRequest
1 голос
/ 20 января 2020

мы используем Spring в нашем проекте, и сегодня я обнаружил, на мой взгляд, странный beaviour. На мой взгляд, Dependency Injection и аннотация @DependsOn должны быть одинаковыми в следующих обоих случаях

@Bean
public ClassA classA(){
    //code
}

@Bean
public ClassB classB(ClassA classA){
    someMethodWhichNeedsClassA()
}

и

@Bean
public ClassA classA(){
    //code
}

@Bean
@DependsOn("classA")
public ClassB classB(){
    someMethodWhichNeedsClassA()
}

Кажется, что оба эти способа не идентичны. Мне не разрешено делиться своим кодом, но в первом случае у меня есть доступ к списку, который заполнен в первом Бине, но не во втором случае. Я пытался найти что-то в документации или в других блогах, но безуспешно.

Есть у кого-нибудь идея, есть ли различия между этими двумя способами, потому что я думаю, что это как-то связано с упорядочением создания бобов, и это все.

Спасибо за любую помощь

Ответы [ 3 ]

1 голос
/ 27 марта 2020

Проще говоря, есть два сценария ios

  1. Если создание бинов происходит последовательно, пружина начнет инициализацию сверху вниз. В этом случае, в зависимости от того, что нужно bean-компоненту, сначала перечислить
  2. Если создание бинов происходит не по порядку и управляется с помощью нескольких appconfig, в этом мы можем использовать аннотацию @DependsOn, чтобы убедиться, что зависимые бины инициализируются перед получением используется.
0 голосов
/ 21 января 2020

Если компонент B вызывает какой-либо метод в компоненте A (или переходит к некоторым другим объектам / методам, которые в конечном итоге вызывают методы компонента A), тогда достаточно внедрения зависимостей.

Ошибка: существуют случаи, когда компонент B делает не нужно вызывать какие-либо методы для bean-компонента A, но зависит от результата инициализации bean-компонента A. Предположим, что bean-компонент A во время своей инициализации создает таблицы в базе данных, и bean-компонент B нуждается в этих таблицах, прежде чем его можно будет использовать. Тогда внедрение зависимости не имеет смысла. Любая проверка качества кода покажет вам, что введенная переменная не используется и, следовательно, не нужна. В этом случае вы не вводите компонент A в B, а объявляете зависимость от компонента A.

Вкратце: если компонент B вызывает компонент A, используйте внедрение зависимостей. Если компоненту B требуются только результаты инициализации компонента A, используйте @DependsOn.

0 голосов
/ 20 января 2020

Spring по умолчанию управляет жизненным циклом бинов и упорядочивает их порядок инициализации. Так обстоит дело в вашем первом примере. В то время как во втором примере вы говорите Spring, что компонент B зависит от A. Поэтому Spring создаст компонент A перед компонентом B.

@ DependsOn из документов Spring:

Бобов, от которых зависит текущий боб. Все указанные бины гарантированно создаются контейнером до этого бина. Используется нечасто в тех случаях, когда бин явно не зависит от другого через свойства или аргументы конструктора, а скорее зависит от побочных эффектов инициализации другого бина.

Baeldung spring DependsOn

...