Что такое Spring Framework и зачем он нужен

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

Так вот, где-то до 2003 работать с бинами в Java EE было очень непростой, запутанной задачей.

Чтобы создавать и использовать бины нужно было писать очень много кода и продуктивность очень сильно страдала, так, что даже была написана книжка “Java EE без использования бинов” )))

Спринг фреймворк как раз нужен, чтобы упросить всё это дело. Для упрощения создания, конфигурации и взаимодействия бинов.


Dependency injection(DI), IoC(Inversion of Control)

Существует такая вещь, как DI (Dependency Injection) — внедрение зависимостей.

Этот паттерн можно было увидеть по ходу курса много раз. Вот он:

public class Car {   private Engine brand;       Car(Engine brand){        this.brand = brand;     }

То есть объект(бин) Engine в данном примере внедряется в другой бин Car через конструктор или сеттер извне. Объект, который внедряется еще называют зависимостью.

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

В Spring за создание бинов и внедрение внешних зависимостей отвечает IoC Controller (BeanFactory).

IpC расшифровывается как Inversion of Control (инверсия контроля). Это тоже паттерн в соответствии с которым в приложении есть некоторая функциональность, которая выполняет некоторые действия за программиста, например, как в данном случае внедрение внешних зависимостей перекладывается с плеч программиста на Spring Framework и на IoC Controller в частности.


Установка Spring

Демонстрировать работу со Spring Framework будем в сервлет-среде, в которой мы уже работали.

Сервлет-среда не особо заточена под спринг, в принципе можно было бы показывать азы спринга и в обычном приложении с методом main, но давайте сразу работать с веб-средой, поскольку спринг всё таки в основном фреймворк для разработки веб-приложений.

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

Скачиваем по ссылке:

https://drive.google.com/file/d/19qPe8keK7dysIF0xzpJLQ--nP0OCL_51/view?usp=sharing

Закидываем содержимое архива в папку lib в WEB-INF.


Создание классов бинов

Для начала, давайте создадим классы бинов, объекты которых Spring Framework будет создавать и связывать с помощью DI.

Представим ситуацию, что администратор сел за серверный компьютер и сказал “Я администратор”.

Смоделируем эту ситуацию только с помощью бинов. То есть нам нужно создать бин Administrator и бин ServerPC. Бин Administrator будет внедряться в бин ServerPC. И этот бин администратор будет использован в бине серверный компьютер для вызова сообщения  “Я администратор!”.

Сначала давайте создадим класс бина, который будет внедряться в другой бин. То есть создадим класс администратора.

Сначала давайте :

package com.someclasses; public class Administrator{ public String adminMessage(){ return “I’m an administrator!”; } }

Теперь создадим класс бина, в который будет внедрятся и в котором будет использоваться созданный выше класс. То есть создадим класс Серверного ПК.

package com.someclasses; //Очень простой класс ничего нового //Поля, геттеры, сеттеры, конструктор. public class ServerPC{ private Administrator admin; private String pcid; private String pcBrand; ServerPC() {} //внедрение будет происходить //с помощью конструктора ServerPC(Administrator admin) { this.admin = admin; } public void setAdmin(Administrator admin) { this.admin = admin; } public Administrator getAdmin() { return admin; } public void setPCid(String pcid) { this.pcid = pcid; } public void setPCBrand(String pcBrand) { this.pcBrand = pcBrand; } public String getPCid() { return pcid; } public String getPCBrand() { return pcBrand; } //Как видим внедренный admin будет //использован в объекте класса ServerPC //(то есть в бине ServerPC) для вывода //сообщения “Я администратор!” public String getAdminMessage() { return admin.adminMessage(); } }

Конфигурация бинов

Давайте же сконфигурируем наши первые два бина на основе тех классов, которые мы написали. Один бин будет внедряться в другой с помощью конструктора.

Конфигурация бинов происходит в xml файле. Название может быть любым, но принято называть applicationContext.xml.

Бин – это объект, который будет создаваться на основе конфигураций заданных в этом xml файле при создании объекта BeanFactory.

applicationContext.xml:


Создание и получение бинов в Java программе.

Давайте же теперь создадим класс сервлета, в котором создадим объект BeanFactory, который создаст нам бины, которые мы определяли выше для данного класса сервлета.

Пример программы:

import javax.servlet.*; import javax.servlet.http.*; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import java.io.*; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.someclasses.ServerPC; @WebServlet(“/springservlet”) public class SpringServlet extends HttpServlet{ protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //с помощью ClassPathXmlApplicationContext //(одна из реализаций BeanFactory) извлекаем //конфигурацию из applicationContext.xml ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext( “applicationContext.xml”); //При создании объекта BeanFactory, //то есть context на основе файла, в котором //мы конфигурировали бины, создаются эти бины //и они хранятся в этом context. //И теперь мы можем извлечь созданные бины //из этого context с помощью метода getBean. //При этом указываем id бина и его класс либо //интерфейс, который реализует класс бина. ServerPC serverpc = context.getBean(“serverPCBean”,ServerPC.class); //Теперь пускай админ за компьютером //скажет “I’m an administrator!” resp.getWriter().write(serverpc.getAdminMessage()); } }

Проверка работы приложения

Теперь проверим скажет ли администратор “I’m an administrator!”.

Компилируем Java файлики. Файл сервлета при этом компилируем с использованием jar файлов спринг:

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

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

Search Icon

При этом, заметьте, что в классе сервлета мы не создавали объектов и не внедряли их никуда, это сделала за нас BeanFactory и в итоге наш Java код не замусорен созданиями объектов и внедрениями, а их может быть довольно много в большом приложении, все определения и внедрения бинов вынесены в applicationContext.xml.

Внедрение зависимостей с помощью сеттера.

Изучите внедрение зависимостей в Spring через сеттеры. Практический гайд по DI с примерами кода Java и XML-конфигурации.
Time to read: 17

Внедрение значений из внешнего файла в поля бина.

Как внедрять значения в Spring-бины из properties-файлов. Практическое руководство по использованию property-placeholder и ${} синтаксиса в XML-конфигурации.
Time to read: 18

Области видимости бинов (Spring Scopes)

Разбираем 5 областей видимости Spring-бинов: singleton, prototype, request, session и global-session. Примеры конфигурации и использования в сервлетах.
Time to read: 16