В разделе по сервлетам мы уже встречались с так называемыми бинами
— это обычные объекты классов с приватными полями, геттерами и сеттерами.
Так вот, где-то до 2003 работать с бинами в Java EE было очень непростой, запутанной задачей.
Чтобы создавать и использовать бины нужно было писать очень много кода и продуктивность очень сильно страдала, так, что даже была написана книжка “Java EE без использования бинов” )))
Спринг фреймворк как раз нужен, чтобы упросить всё это дело. Для упрощения создания, конфигурации и взаимодействия бинов.
Dependency injection(DI), IoC(Inversion of Control)
Существует такая вещь, как DI
(Dependency Injection) — внедрение зависимостей.
Этот паттерн можно было увидеть по ходу курса много раз. Вот он:
То есть объект(бин) Engine
в данном примере внедряется в другой бин Car
через конструктор или сеттер извне. Объект, который внедряется еще называют зависимостью
.
То есть суть в том, что два объекта разных классов отдельны друг о друга и нам их нужно как-то связать между собой, чтобы один объект пользовался другим и сделать это можно через такое внедрение.
В Spring за создание бинов и внедрение внешних зависимостей отвечает IoC Controller (BeanFactory).
IpC
расшифровывается как Inversion of Control (инверсия контроля). Это тоже паттерн в соответствии с которым в приложении есть некоторая функциональность, которая выполняет некоторые действия за программиста, например, как в данном случае внедрение внешних зависимостей перекладывается с плеч программиста на Spring Framework и на IoC Controller в частности.
Установка Spring
Демонстрировать работу со Spring Framework будем в сервлет-среде, в которой мы уже работали.
Сервлет-среда не особо заточена под спринг, в принципе можно было бы показывать азы спринга и в обычном приложении с методом main
, но давайте сразу работать с веб-средой, поскольку спринг всё таки в основном фреймворк для разработки веб-приложений.
Для начала, необходимо скачать jar файлы спринг, с помощью которых будем компилировать классы, в которых используется спринг.
Скачиваем по ссылке:
Закидываем содержимое архива в папку lib в WEB-INF.

Создание классов бинов
Для начала, давайте создадим классы бинов, объекты которых Spring Framework будет создавать и связывать с помощью DI.
Представим ситуацию, что администратор сел за серверный компьютер и сказал “Я администратор”.
Смоделируем эту ситуацию только с помощью бинов. То есть нам нужно создать бин Administrator
и бин ServerPC
. Бин Administrator
будет внедряться в бин ServerPC
. И этот бин администратор будет использован в бине серверный компьютер для вызова сообщения “Я администратор!”.
Сначала давайте создадим класс бина, который будет внедряться в другой бин. То есть создадим класс администратора.
Сначала давайте :
Теперь создадим класс бина, в который будет внедрятся и в котором будет использоваться созданный выше класс. То есть создадим класс Серверного ПК.
Конфигурация бинов
Давайте же сконфигурируем наши первые два бина на основе тех классов, которые мы написали. Один бин будет внедряться в другой с помощью конструктора.
Конфигурация бинов происходит в xml файле. Название может быть любым, но принято называть applicationContext.xml
.
Бин – это объект, который будет создаваться на основе конфигураций заданных в этом xml файле при создании объекта BeanFactory
.
applicationContext.xml:
Создание и получение бинов в Java программе.
Давайте же теперь создадим класс сервлета, в котором создадим объект BeanFactory
, который создаст нам бины, которые мы определяли выше для данного класса сервлета.
Пример программы:
Проверка работы приложения
Теперь проверим скажет ли администратор “I’m an administrator!”.
Компилируем Java файлики. Файл сервлета при этом компилируем с использованием jar файлов спринг:

Запускаем Tomcat и открываем страницу сервлета по пути /springservlet
:

Как видим, сказал. Из этого можно сделать вывод что объект, то есть бин класса Administrator
внедрен в бин класса ServerPC
, так как мы помним, что строку I’m an administrator возвращает метод именно класса Administrator
и если бы в объекте serverpc не было объекта класса Administrator
, то метод getAdminMessage
объекта serverpc
вернул бы ошибку.
При этом, заметьте, что в классе сервлета мы не создавали объектов и не внедряли их никуда, это сделала за нас BeanFactory
и в итоге наш Java код не замусорен созданиями объектов и внедрениями, а их может быть довольно много в большом приложении, все определения и внедрения бинов вынесены в applicationContext.xml.