ceramicthree
@ceramicthree

Почему вместо аннотации @Autowired рекомендуют использовать конструктор?

Недавно начал изучать Spring и стало интересно почему комьюнити и само IDE рекоммендует не использовать @Autowired
Чем такой код:
private final EmployeeRepository repository;

EmployeeController(EmployeeRepository repository) {
    this.repository = repository;
  }

лучше этого:
@Autowired
private EmployeeRepository repository;
  • Вопрос задан
  • 160 просмотров
Решения вопроса 1
Bavashi
@Bavashi
Вот здесь есть подробная статья. Можете даже через машинный перевод почитать.
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@Jacen11
типа при тестировании. Когда тест будешь писать не забудешь подставить объекты. А так особо без разницы вроде
Ответ написан
@azerphoenix
Я и сам изучаю пока что Spring.
Прежде всего рекомендую прочитать книгу Spring in action. Там описаны все возможности DI и их преимущества.
1 - DI property
@Autowired
private SomeClass someClass

2 - DI setter
3 - DI constructor
@Autowired
private final SomeClass someClass;
SomeService (SomeClass someClass) {
this.someClass = someClass;
}


Насчет использования аннотации @Autowired
Использование этой аннотации необязательно в принципе. Но если например для класса имеется несколько конструкторов, то нужно для одного из них добавить аннотацию.

Я например, в своих pet проектах использую так:
@RequiredArgsConstructor
public class PageController {
private final SomeClass1 someClass1;
private final SomeClass2 someClass2;
private final SomeClass3 someClass3;
}

Т.е. подключаю lombok и использую DI конструктором...
Ответ написан
johnny_jla
@johnny_jla
Java Developer
Как по мне между внедрением через конструктор и сеттер есть существенная разница. С помощью конструктора можно скрыть не изменяемые атрибуты класса, сеттер этого не обеспечит, поэтому в подобных случаях он не подходит. Но у внедрения через конструктор, есть проблема, он может породить циклическую зависимость, чего нет при использовании сеттера. Также циклическую зависимость при инжекции в конструкторе можно исправить с помощью аннотации @Lazy перед параметром, который вызывает зависимость. Эти способы применяются для разных задач. А инжекции в поле я вообще не люблю, т.е. идёт как бы нарушение инкапсуляции, у тебя есть приватное поле, которое не сетится ни в конструкторе, ни методе, но значение туда записываются.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
МегаФон Нижний Новгород
от 60 000 ₽
Информзащита Москва
от 150 000 до 200 000 ₽
Bell Integrator Ростов-на-Дону
от 100 000 до 180 000 ₽