Топ-100Что такое Spring Framework и зачем он нужен - CodOrbits
LogoCodOrbits

Раздел: Spring Framework

Изучите Spring Framework — один из самых популярных фреймворков Java для создания гибких и масштабируемых приложений.

Все разделы
Иконка Spring Framework

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

Last updated: 10 мая 2025 г.

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

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

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

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


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

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

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

1public class Car {
2   private Engine brand;    
3   Car(Engine brand){  
4      this.brand = brand;    
5}

То есть объект(бин) 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. И этот бин администратор будет использован в бине серверный компьютер для вызова сообщения  “Я администратор!”.

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

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

1package com.someclasses;
2
3public class Administrator{
4    public String adminMessage(){
5        return "I’m an administrator!";
6    }
7}

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

1package com.someclasses;
2
3//Очень простой класс ничего нового
4//Поля, геттеры, сеттеры, конструктор.
5public class ServerPC{
6    private Administrator admin;
7    private String pcid;
8    private String pcBrand;
9
10    ServerPC() {}
11
12    //внедрение будет происходить
13    //с помощью конструктора
14    ServerPC(Administrator admin) {
15        this.admin = admin;
16    }
17
18    public void setAdmin(Administrator admin) {
19        this.admin = admin;
20    }
21
22    public Administrator getAdmin() {
23        return admin;
24    }
25
26    public void setPCid(String pcid) {
27        this.pcid = pcid;
28    }
29
30    public void setPCBrand(String pcBrand) {
31        this.pcBrand = pcBrand;
32    }
33
34    public String getPCid() {
35        return pcid;
36    }
37
38    public String getPCBrand() {
39        return pcBrand;
40    }
41
42    //Как видим внедренный admin будет
43    //использован в объекте класса ServerPC
44    //(то есть в бине ServerPC) для вывода
45    //сообщения "Я администратор!"
46    public String getAdminMessage() {
47        return admin.adminMessage();
48    }
49}

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

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

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

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

applicationContext.xml:

1<?xml version="1.0" encoding="UTF-8"?>
2<beans xmlns="http://www.springframework.org/schema/beans"
3       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4       xmlns:context="http://www.springframework.org/schema/context"
5       xsi:schemaLocation="http://www.springframework.org/schema/beans
6       http://www.springframework.org/schema/beans/spring-beans.xsd
7       http://www.springframework.org/schema/context
8       http://www.springframework.org/schema/context/spring-context.xsd">
9
10<!-- Здесь конфигурируем бины чтобы BeanFactory
11     нам их создавал как сконфигурировано здесь.-->
12
13<!-- Вместо конфигурации бинов в этом файле
14     создать бин админа и ПК и внедрить админа в ПК
15     можно было бы в Java классе вот так:
16     Administrator someAdminBean = new Administrator();
17     ServerPC serverPCBean = new ServerPC(someAdminBean);
18     Две строчки Java кода выше это то что делает
19     beanfactory когда мы его создаем. То есть он
20     читает этот файл видит два что сконфигурированы
21     два бина и создает эти два бина по этим конфигурациям
22     внедряя при этом зависимости.
23-->
24
25<!-- Собственно в двух бинах ниже вся суть спринга.
26     Он создает объекты и внедряет зависимости.-->
27
28    <bean id="someAdminBean" class="com.someclasses.Administrator">
29    </bean>
30
31    <bean id="serverPCBean" class="com.someclasses.ServerPC">
32    <!--бин someUserBean будет внедряться
33         в serverPCBean через конструктор.-->
34        <constructor-arg ref="someAdminBean"/>
35<!-- Помним что в классе ServerPC мы определили
36     такой конструктор ServerPC(Administrator admin).
37     Думаю понятно что тег constructor-arg использует его
38     для внедрения someAdminBean в serverPCBean. -->
39    </bean>
40
41</beans>

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

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

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

1import javax.servlet.*;
2import javax.servlet.http.*;
3import javax.servlet.ServletException;
4import javax.servlet.annotation.WebServlet;
5import java.io.*;
6import org.springframework.context.support.ClassPathXmlApplicationContext;
7import com.someclasses.ServerPC;
8
9@WebServlet("/springservlet")
10public class SpringServlet extends HttpServlet{
11    protected void doGet(HttpServletRequest req,
12                         HttpServletResponse resp)
13        throws ServletException, IOException {
14        //с помощью ClassPathXmlApplicationContext
15        //(одна из реализаций BeanFactory) извлекаем
16        //конфигурацию из applicationContext.xml
17        ClassPathXmlApplicationContext context =
18            new ClassPathXmlApplicationContext(
19                "applicationContext.xml");
20        //При создании объекта BeanFactory,
21        //то есть context на основе файла, в котором
22        //мы конфигурировали бины, создаются эти бины
23        //и они хранятся в этом context.
24        //И теперь мы можем извлечь созданные бины
25        //из этого context с помощью метода getBean.
26        //При этом указываем id бина и его класс либо
27        //интерфейс, который реализует класс бина.
28        ServerPC serverpc =
29            context.getBean("serverPCBean",ServerPC.class);
30        //Теперь пускай админ за компьютером
31        //скажет "I’m an administrator!"
32        resp.getWriter().write(serverpc.getAdminMessage());
33    }
34}

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

Теперь проверим скажет ли администратор “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 от VMware

Additional Material Icon
Divider

Разбор Dependency Injection на примерах

Additional Material Icon
Divider

Будущее Spring

Additional Material Icon

Следующие уроки

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

17
мин.

Similar Articles Icon
Divider

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

18
мин.

Similar Articles Icon
Divider

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

16
мин.

Similar Articles Icon