Comments 11
1. XML. Опять XML. Который устарел уже несколько лет назад и довольно сложен для понимания. К тому же дикая связь с annotation config.
2. Инъекция в приватные поля сильно затрудняет юнит тестирование.
Приходится применять ReflectionTestUtils и другие хаки. Лучше все-же использовать инъекцию через конструктор. Последние версии спринга прекрасно умеют инжектить в конструктор даже без аннотации Autowired на нем
Сложен для понимания? Ну не знаю, мне — нет, вероятно дело привычки. Поддержка со стороны IDEA только в Ultimate версии, это да, не очень удобно. Ну то есть, если это текст для начинающих, иметь представление что XML контексты бывают — это полезно.
Мне вот другое любопытно. Спрингу сто лет в обед. Autowired там появились кажется примерно в тоже время, что и JavaEE 6, т.е. лет 10 назад. Ресурсов на эту тему в интернете куча, в том числе на русском. Эта тема тут реально кому-то интересна?
А были проекты, где примерно треть контекстов вот так вот грузилась время от времени.
Опять же — я не призываю так делать, были вполне живые эксплойты на такую тему, вполне очевидно, что это позволяет выполнять фактически произвольный код, если разработчик был неаккуратен. Я просто ради того, чтобы понимать, где средства компиляции, а где рантайм.
2. Совершенно наоборот. При тестировании вы легко используете тестовый апликейшен контекст, в котором могут быть реализованы мокированные объекты, необходимые для тестов и инъекция будет абсолютно прозрачной.
Создать сеттер и с помощью его вызова устанавливать продавцу магазин:
Это заведомо плохое решение, т.к. сразу позволяет создавать "ненастроенные" объекты как продавец без магазина. Сеттеры еще можно использовать для опциональных полей, но для обязательных — т.е. тех, при которых объект не будет работать — лучше использовать конструктор и final-поля. Именно он, собственно, и задают dependencies.
И, наконец, мы подобрались к спрингу: он предоставляет еще один способ внедрять зависимости.
А это самый быстрый и самый плохой способ. Все ваши объекты становятся въявную завязанными на контейнер и без него уже не способны работать. Ни протестировать нормально ни переиспользовать потом.
Возможно вы сейчас думаете, зачем все эти сложности. Но представьте, что у нас приложение не из 2 классов, а на несколько порядков больше и управление зависимостями уже становится не самой тривиальной задачей.
Уж поверьте, еще более нетривиальной задачей это становится со спрингом. Особенно когда в проекте несколько разрабов. Когда все внеявную завязано на текущих настройках и умолчаниях, любое изменение либо не тупо работает, либо что-то рушит. Поэтому типичный проект на спринге связывает не более десятка бинов, и используют его совсем не из-за DI, а из-за легкого бутстрапа различных технологий из коробки.
Если нужен DI, возьмите Guice.
Эта статья поможет вам взобраться на самую первую ступеньку: понять общую идею столь популярного фреймворка.
Из статьи не понял ни что такое Spring ни для чего он нужен и как помогают эти зависимости.
Введение в Spring, или что делать, если по всему проекту @Autowired и @Component, а вы не понимаете, что это