Как предотвратить использование @autowired - PullRequest
0 голосов
/ 23 сентября 2019

Я узнал, что автоматическое подключение бобов на самом деле не очень хорошая практика.Это также упоминается в весеннем документе.Я знаю, что есть два типа конфигурации бина.Один - с помощью XML-конфигурации, другой - с помощью класса конфигурации Java.Если мы хотим использовать код для настройки бина, а не с помощью @autowired, как мы можем это сделать?Кажется, что если вы используете код, нам все еще понадобится @autowired для того, чтобы внедрить бин?

например, в следующем, если мы не хотим использовать @Autowired, как мы можем это сделать?и какая должна быть лучшая практика?

@Service
public class ClassA {
  private ClassB classB;

  @Autowired
  public ClassA(ClassB classB) {
    this.classB = classB;
  }
}

Ответы [ 3 ]

8 голосов
/ 23 сентября 2019

Где вы читали, что автопроводка - плохая практика?Автопроводка - это автоматическое внедрение зависимостей - основная функция Spring.

Я думаю, что вы читали, что внедрение полей, как это плохо, потому что, например, делает невозможным определение зависимостей для тестирования:

@Service
public class ClassA {
  @Autowired
  private ClassB classB;

}

В более новых версиях Spring вы можете опустить аннотацию @Autowired в конструкторе, если у класса есть только один конструктор.

1 голос
/ 23 сентября 2019

Лучше использовать инжекцию зависимости конструктора, если это возможно, потому что инъекция конструктора предотвращает циклические зависимости.

@Service
// @RequiredArgsConstructor // if using lombok
public class ClassA {
     private ClassB classB;

     // If not using lombok
     public ClassA(ClassB classB) {
          this.classB = classB;
     }
}

Однако инъекция сеттера также работает.Посмотрите больше ответов здесь .

1 голос
/ 23 сентября 2019

Один из вариантов - использовать класс @Configuration с методами @Bean внутри.Что-то вроде этого.

@Configuration 
public MyConfigClass {

    @Bean
    ClassB makeClassB(){
        return new ClassB();
    }

    @Bean
    ClassA makeClassA(final ClassB classB){
        return new ClassA(classB);
    }
}

Обратите внимание, что если класс @Component имеет единственный конструктор, он по умолчанию аннотируется @Autowired.Это может помочь объяснить, почему иногда кажется, что это работает, но вы не видите никаких инъекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...