Spring IoC. Пример

Принцип инверсии контроля (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?"
Давайте взглянем на диаграмму классов в этом примере. Зеленые стрелки идентифицируют обобщение, а голубые - ассоциацию.

Как видим, эта архитектура содержит множество тяжелых связей. Мы создаем объект QuizMaster в классе QuizMasterService следующим образом:
Для того, чтобы задать вопрос относительно struts, необходимо сделать модификации в коде:
Теперь посмотрим, как можно обойти это с использованием шаблона внедрения зависимостей. В нашем случае, компоненту необходимо всего лишь выбрать путь приема ресурсов и контейнер будет доставлять ресурсы к компонентам.
В нашем примере вместо прямого создания объекта бина QuizMaster в классе QuizMasterService, мы будем использовать контейнер для проделывания этой работы для нас. Вместо вставки хардкодов значений мы позволим контейнеру внедрять необходимые зависимости.
Мы можем внедрить зависимости с использованием внедрения через сеттеры или конструктор.
Вот как это можно сделать с использованием внедрения через сеттеры:
Значение для QuizMaster будет задано с использованием метода setQuizMaster(). Объект QuizMaster никогда не будет создаваться внутри класса QuizMasterService, но тем не менее, мы будем иметь к нему доступ. Обычно, в таких случаях мы получаем NullPointerException, но в данном случае контейнер создаст объект для нас.
После внесения всех изменений, диаграмма классов выглядит следующим образом:

На изображении появился контейнер. Он и займется внедрением зависимостей.
Конфигурация бина описана в beans.xml:
Мы определили каждый из бинов через тег bean. Атрибут id тега bean присваивает логическое имя бину, а класс attribute представляет реальный класс бина. Тег property используется для ссылки на свойство бина. Для внедрения бина через сеттер необходимо использовать тег ref.
Вот пример ссылки на SpringQuizMaster, внедренной в бин QuizMaster. При выполнении данного примера получим сообщение "Are you new to Spring?".
Для того, чтобы заставить QuizMaster задавать вопросы относительно Struts, необходимо всего лишь изменить ссылку на бин в теге ref.
В данном случае, внедрение зависимостей помогает нам в "развязывании", отделении компонентов друг от друга.
Для выполнения данного примера необходимо добавить следующие jar файлы в classpath.
Материалы, которые могут вас заинтересовать
- Spring. Теги на форме / Form Tags
- Spring. Внедрение через конструктор / Constructor injection
- Spring. Внедрение через сеттер / Setter injection
- Spring: Контроллеры, основанные на аннотациях / Annotation Controller. Пример
- Spring SimpleFormController. Пример
- Пример Spring MVC
- Spring. Как это работает? Часть 3
- Spring. Как это работает? Часть 1
- Java Советы







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