Spring IoC. Пример

max аватар
93
Находится в разделах:

Принцип инверсии контроля (Inversion of Control) в Spring реализован с использованием шаблона проектирования Dependency Injection. Рассмотрим внедрение зависимостей на реальном примере. 

Сперва рассмотрим пример с точки зрения реализации на java, а затем добавим функционал Spring

Интерфейс QuizMater содержит только один метод popQuestion()

Классы StrutsQuizMaster и SpringQuizMaster реализуют интерфейс QuizMaster и задают вопросы относительно тематик struts и spring.

У нас также есть класс QuizMasterService, который задает вопрос пользователю. 

Класс QuizMasterService содержит ссылку на интерфейс QuizMaster.

Ну и, наконец, у нас есть класс QuizProgram для управления процессом викторины.

Как видим, пример предельно прост. Мы создаем объект класса QuizMasterService и вызываем его метод askQuestion()

При запуске программы, как и ожидалось, получим вопрос "Are you new to Spring?"

 

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

dependency injection

Как видим, эта архитектура содержит множество тяжелых связей. Мы создаем объект QuizMaster  в классе QuizMasterService следующим образом:

Для того, чтобы задать вопрос относительно struts, необходимо сделать модификации в коде:

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

В нашем примере вместо прямого создания объекта бина QuizMaster в классе QuizMasterService, мы будем использовать контейнер для проделывания этой работы для нас. Вместо вставки хардкодов значений мы позволим контейнеру внедрять необходимые зависимости.

Мы можем внедрить зависимости с использованием внедрения через сеттеры или конструктор. 

Вот как это можно сделать с использованием внедрения через сеттеры:

Значение для QuizMaster будет задано с использованием метода setQuizMaster(). Объект QuizMaster никогда не будет создаваться внутри класса QuizMasterService, но тем не менее, мы будем иметь к нему доступ. Обычно, в таких случаях мы получаем NullPointerException, но в данном случае контейнер создаст объект для нас. 

После внесения всех изменений, диаграмма классов выглядит следующим образом:

dependency injection 2

На изображении появился контейнер. Он и займется внедрением зависимостей. 

Конфигурация бина описана в beans.xml:

Мы определили каждый из бинов через тег bean. Атрибут id тега bean присваивает логическое имя бину, а класс attribute представляет реальный класс бина. Тег property используется для ссылки на свойство бина. Для внедрения бина через сеттер необходимо использовать тег ref.

Вот пример ссылки на SpringQuizMaster, внедренной в бин QuizMaster. При выполнении данного примера получим сообщение "Are you new to Spring?".

Для того, чтобы заставить QuizMaster задавать вопросы относительно Struts, необходимо всего лишь изменить ссылку на бин в теге ref.

В данном случае, внедрение зависимостей помогает нам в "развязывании", отделении компонентов друг от друга. 

Для выполнения данного примера необходимо добавить следующие jar файлы в classpath.


Конец
Виктор Суворов, автор многочисленных книг по истории Второй Мировой войны, майор ГРУ, разведчик абсолютно уверен в том, что побеждает в этой жизни только тот, кто победил сам себя. Кто победил свой страх, свою лень, свою неуверенность.

Отличный простой и понятный, "разжеванный" пример. Отлично подойдет для новичков!

Можно скачать пример?

Отправить комментарий

CAPTCHA
Чтобы оставить комментарий, введите пожалуйста код, изображенный на картинке
Image CAPTCHA
Введите символы, изображенные на картинке