Что такое 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
вернул бы ошибку.
При этом, заметьте, что в классе сервлета мы не создавали объектов и не внедряли их никуда, это сделала за нас BeanFactory
и в итоге наш Java код не замусорен созданиями объектов и внедрениями, а их может быть довольно много в большом приложении, все определения и внедрения бинов вынесены в applicationContext.xml.
Дополнительные материалы
Официальный гайд по Spring от VMware
Разбор Dependency Injection на примерах
Будущее Spring
Следующие уроки
Внедрение зависимостей с помощью сеттера.
17
мин.
Внедрение значений из внешнего файла в поля бина.
18
мин.
Области видимости бинов (Spring Scopes)
16
мин.