Подтвердить что ты не робот

Зачем нужна инфраструктура Spring?

Привет, я новичок в String и читаю статью Мартина Фаулера: http://martinfowler.com/articles/injection.html

Он привел пример MovieLister, используя MovieFinder для поиска фильмов. В этом примере он сначала предоставил код:

class MovieLister...
    private MovieFinder finder;
    public MovieLister() {
        finder = new ColonDelimitedMovieFinder("movies1.txt");
    }
}

Он отметил, что вы не можете дать MovieLister своему другу для повторного использования, если только ваш друг не использует ту же самую реализацию MovieFinder и не помещает фильмы в один и тот же файл txt.

Да, конечно, это НЕ так, как вы пишете компонент с надеждой, что кто-то сможет его повторно использовать. Вместо этого, по мере продвижения, вы должны написать:

class MovieLister...
    public MovieLister(MovieFinder finder) {
        this.finder = finder;       
    }
}

Да, это лучше. Теперь ваш друг может взять ваш MovieLister и подключить его собственный код. Для меня история завершена. Я пропущу то, зачем вам нужна инфраструктура Spring для инъекции зависимостей. Зависимость вводится в MovieLister кодом вашего друга. Полная остановка. Вся установка Spring эквивалентна простому реализации интерфейса MovieFinder и делает такой вызов:

MovieFinder myMovieFinder = new MyMovieFinderImpl();
MovieLister myMovieLister = new MovieLister(myMovieFinder);

Просто, легко. Я знаю, что вы жестко кодируете создание экземпляра MyMovieFinderImpl в своем коде. Но какой смысл переместить это в XML, но принести столько других вещей? С тех пор, как программисты так боятся компиляции кода и предпочитают менять XML без компиляции, чтобы все было сделано? Мне очень жаль, но я думаю, что просто не понимаю смысла. Каждая программа использует инъекцию зависимости, несколько десятилетий назад. Но в старые времена зависимость вводится программами, использующими библиотеку или командную строку DOS, или графический интерфейс. Почему теперь нам нужен еще один способ инъекционной зависимости?

Спасибо.

Обновлено:

Ну, многие из вас, ребята, добавили аннотацию. В моем ясном понимании Spring я могу чувствовать себя более комфортно, используя XML, а не аннотацию. По крайней мере, есть центральное место, в котором указано, как зависимость, таким образом, что это легче понять. С аннотацией нет такого центрального места. Вместо этого происходит просто волшебство. Хотите знать, что передается в качестве параметра? Пойди сами себе и удачи. Да, я знаю, что смарт-плагины IDE помогают перемещаться по коду. Но почему мы делаем что-то сложное в первую очередь и отмечаем другое, что помогает сделать нашу жизнь проще? Правда, что аннотирование делает код более сложным для просмотра и понимания, поэтому люди создают плагины IDE для этого достаточно очевидно, что мы можем создавать ненужные вещи в первую очередь, не так ли?

4b9b3361

Ответ 1

В коде "старые дни" был написан как в первом примере.

Spring - это библиотека, которая, по вашему мнению, является одним из способов, которым это было сделано в "старые времена".

Реализации редко указывались в командной строке или через графический интерфейс. Множественные реализации одинаковой функциональности не нужны так часто, потому что (а) системы были редко такими сложными, как сегодня, (б) им не нужно было взаимодействовать с другими системами так, как они делают сегодня, и (в) глубокие тестирование было реализовано гораздо реже.

Что "столько других вещей"? Spring разделяется; вы можете принести только то, что вам нужно.

Почему вы игнорировали конфигурацию через аннотации?

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

Является ли Spring необходимым для DI/IoC? Нет, и множество других рамок DI подтверждают это. Это общеизвестный, по сути, стандартный способ сделать это? Да.

Ответ 2

Не путайте принцип (DI) с одной реализацией (Spring).

Если вам нравится DI, но предпочитайте делать проводку в своем коде: используйте Google Guice.

Если вам нравится DI, но предпочитайте делать проводку в коде и, возможно, XML, используйте CDI (из дорожки Java EE).

Если вы любите DI и любите XML (или должны изменить поведение своего приложения, переконфигурировав его), просто используйте Spring.

Если вам не нравится DI, задайте другой вопрос.

Хорошо иметь несколько реализаций того же принципа.

Ответ 3

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

Кстати, в последних версиях Spring вам не нужно много работать с XML, вы можете объявлять зависимости с аннотациями.