Какова лучшая практика создания экземпляров Spring / Spring в цепочке bean-компонентов? - PullRequest
0 голосов
/ 31 января 2020

При загрузке Spring / Spring какая стратегия реализации двух приведенных ниже лучше?

Первая:

@Component
Class ServiceA{
  ServiceB b;
  public ServiceA(ServiceB b) {
    this.b = b;
  }
}

, где ServiceB также равен @Component.

Секунда:

@Component
Class ServiceA{
  ServiceB b;
  public ServiceA() {
    this.b = new ServiceB();
  }
}

, где ServiceB - это обычный класс без аннотации Spring.

Из того, что я знаю, Spring создает только один экземпляр класса @Component как синглтон. Поэтому, если я правильно понимаю, обе стратегии создают экземпляр только одного экземпляра ServiceA и ServiceB (в методе 2 new ServiceB() был вызван только один раз, поскольку существует только один экземпляр ServiceA).

У меня был Использовал первую стратегию для моего предыдущего приложения, но недавно я обнаружил, что вторая стратегия облегчает написание тестовых случаев, поскольку мне не нужно загружать контекст Spring (или создавать экземпляры всех связанных компонентов вручную для создания родительского компонента), поэтому тестирование выполняется намного быстрее. .

1 Ответ

2 голосов
/ 31 января 2020

обе стратегии реализуют только один экземпляр ServiceA и ServiceB

Правильно, если этот код является полным кодом, но ...

Если позже у вас есть ServiceC, который также хочет использовать ServiceB, вторая стратегия не может повторно использовать ServiceB синглтон. Первая стратегия работает без необходимости рефакторинга кода.

Использовать первую стратегию.


Я обнаружил, что вторая стратегия облегчает написание тестовых случаев

Неверно. Вторая стратегия исключает написание unit тестов, потому что вы не можете создать экземпляр ServiceA с фиктивной ServiceB реализацией для тестирования only ServiceA кода, то есть "unit".

При второй стратегии ошибка в коде ServiceB сделает ServiceA некорректным, даже если ServiceA идеально.

Используйте первую стратегию.

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