ceramicthree
@ceramicthree

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

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

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

лучше этого:
@Autowired
private EmployeeRepository repository;
  • Вопрос задан
  • 4826 просмотров
Пригласить эксперта
Ответы на вопрос 4
Jacen11
@Jacen11
типа при тестировании. Когда тест будешь писать не забудешь подставить объекты. А так особо без разницы вроде
Ответ написан
azerphoenix
@azerphoenix Куратор тега Java
Java Software Engineer
Я и сам изучаю пока что 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 перед параметром, который вызывает зависимость. Эти способы применяются для разных задач. А инжекции в поле я вообще не люблю, т.е. идёт как бы нарушение инкапсуляции, у тебя есть приватное поле, которое не сетится ни в конструкторе, ни методе, но значение туда записываются.
Ответ написан
Комментировать
На сколько я помню, из документации, то Spring говорит - если есть возможно, то, лучше не использовать аннотация и вообще привязываться жёстко к Spring-у не хорошая идея. Что то в этом духе как бы так. Ну и если логично подумать, например, произошло какое то обновление с этими аннотациями, то ваше приложение сломается, а если будут конструкторы, менее вероятно что ваше приложение сломается. Ну в общем как то так мой юный друг.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Похожие вопросы