Как работает аннотация @Autowired в Spring? - PullRequest
3 голосов
/ 14 февраля 2012

Реальный вопрос в том, почему мне разрешено писать этот код двумя способами:

@Controller
public class PostController {
@Autowired 
private PostService postService;

@Autowired 
private CommentService commentService;

....
}

и

@Controller
public class PostController {

private PostService postService;
private CommentService commentService;

@Autowired 
public PostController(PostService postService, CommentService commentService){
    this.postService = postService;
    this.commentService = commentService;
}

....
}

Эти фрагменты идентичны? Какой из них рекомендуется?

Ответы [ 4 ]

2 голосов
/ 14 февраля 2012

Первое решение напрямую вводит значения с отражением (в основном JVM возьмет ваш объект и вручную установит значение).

Второе решение использует конструктор, то есть параметр является обязательным.Кроме того, у вас есть время поиграть с указанным значением, прежде чем присваивать его своему атрибуту.(обратите внимание, что конструктор также будет вызываться с помощью отражения).

Другой способ - использовать установщик, на этот раз вызывается метод для установки значения, чтобы вы могли поиграть с ним перед его установкой, но этоне является обязательным (так как он не является частью конструктора).

Что касается рекомендуемого, я не уверен, что на самом деле существует одно «официально рекомендованное», но я склонен использовать конструктор только для обязательных полей иустановка сеттера для необязательных полей.Но, насколько я знаю, это в основном зависит от команды, с которой вы работаете, или от вашего вкуса.

1 голос
/ 14 февраля 2012

Вы можете написать их двумя различными способами, потому что Spring решил поддержать эти два способа для внедрения bean-компонентов из контекста приложения (есть даже третий!).

Они будут делать то же самое большую часть времени .Но у каждого есть тонкие различия в том, как они работают.Пожалуйста, взгляните на документацию для получения дополнительных разъяснений, поскольку более мелкие детали можно объяснить лучше там.

0 голосов
/ 15 февраля 2012

С точки зрения тестирования, они НЕ одинаковы. Если у вас нет метода установки для PostService и CommentService, вы не сможете легко установить их значения.

Обычно для @Autowired вот так, он устанавливается как область видимости пакета вместо

    @Autowired 
    private PostService postService;

мы делаем

    @Autowired 
    PostService postService;

Обратите внимание, нет "частного".

Причина сделать это ... Только классы с одним и тем же пакетом могут читать / записывать переменную, и когда вы выполняете тестовый класс, обычно он находится в том же пакете, что и тестируемый модуль.

0 голосов
/ 14 февраля 2012

Я ожидаю, что зависимости в первом примере будут внедрены после того, как конструктор в PostController вернется. Во втором примере я ожидаю, что зависимости будут введены при выполнении конструктора. то есть второй пример был бы своего рода гарантией наличия зависимостей при выполнении конструктора, чего не произойдет в первом примере.

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