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