Топ-100Области видимости бинов (Spring Scopes) - CodOrbits
LogoCodOrbits

Раздел: Spring Framework

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

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

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

Last updated: 10 мая 2025 г.

Бин может иметь область, в которой он действует.

Их 5: singleton, prototype, request, session и global-session.

По дефолту scope у бина singleton. Это значит, что если мы в коде сервлета запишем.

1ServerPC serverpc =
2context.getBean("serverPCBean",ServerPC.class);
3ServerPC serverpc1 =
4context.getBean("serverPCBean",ServerPC.class);

то и serverpc и serverpc1 будут ссылаться на один и тот же объект поскольку как помним у синглтона может быть только один экземпляр.

Если бину serverPCBean в конф. файле установить scope="prototype", то в приведенном примере создадутся два разных экземпляра.

Также есть:

  • request (при каждом запросе к сервлету создается новый экземпляр (bean)),
  • session (при каждой новой сессии пользователя создается новый экземпляр (bean))
  • global-session (экземпляр распространяется на всё приложение).

Давайте сконфигурируем два бина. У одного будет scope singleton у другого prototype.

applicationContext.xml:

1<?xml version="1.0" encoding="UTF-8"?>
2<beans xmlns="http://www.springframework.org/schema/beans"
3xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4xmlns:context="http://www.springframework.org/schema/context"
5xsi:schemaLocation="http://www.springframework.org/schema/beans
6http://www.springframework.org/schema/beans/spring-beans.xsd
7http://www.springframework.org/schema/context
8http://www.springframework.org/schema/context/spring-context-3.0.xsd">
9
10<context:property-placeholder location="classpath:pc.properties"/>
11
12<bean id="someAdminBean" class="com.someclasses.Administrator">
13</bean>
14
15<bean id="serverPCBean" class="com.someclasses.ServerPC">
16<constructor-arg ref="someAdminBean"/>
17</bean>
18
19<bean id="serverPCBeanSetter" class="com.someclasses.ServerPC">
20<property name="admin" ref="someAdminBean"/>
21<property name="PCBrand" value="Acer"/>
22<property name="pcCid" value="${pcid}"/>
23</bean>
24
25<!--Этот бин будет распространяться на весь класс сервлета
26и сколько бы раз мы не извлекали его из BeanFactory
27с помощью getBean будет возвращаться один и тот же объект.
28То есть существует только один
29бин serverPCBeanpSingletonScope на весь класс сервлета.
30-->
31<bean id="serverPCBeanpSingletonScope"
32class="com.someclasses.ServerPC" scope="singleton">
33<constructor-arg ref="someAdminBean"/>
34</bean>
35
36<!--При каждом вызове getBean будет создаваться
37новый объект. То есть класс сервлета может иметь
38много бинов serverPCBeanpPototypeScope. -->
39<bean id="serverPCBeanpPototypeScope"
40class="com.someclasses.ServerPC" scope="prototype">
41<constructor-arg ref="someAdminBean"/>
42</bean>

Давайте же теперь проверим определенные бины и их скоупы в Java программе.

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

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 context =
15                new ClassPathXmlApplicationContext(
16                        "applicationContext.xml");
17        //Поскольку serverPCBeanpSingletonScope
18        //имеет scope singleton ниже
19        //создадутся две ссылки на один
20        //и тот же объект serverPCBeanpSingletonScope.
21        //То есть при каждом вызове getBean из context
22        //извлекается один и тот же
23        //объект serverPCBeanpPototypeScope
24        ServerPC serverpcSingleton =
25                context.getBean(
26                        "serverPCBeanpSingletonScope",ServerPC.class);
27        ServerPC serverpcSingleton1 =
28                context.getBean(
29                        "serverPCBeanpSingletonScope",ServerPC.class);
30
31        //Проверим правда ли обе ссылки ссылаются
32        //на один и тот же объект
33        //serverPCBeanpSingletonScope.
34        //Установим значение поля pcid
35        //у бина serverPCBeanpSingletonScope
36        //через ссылку serverpcSingleton,
37        serverpcSingleton.setPcid("1233425");
38        //и теперь извлечем его
39        //через другую ссылку – serverpcSingleton1
40        resp.getWriter().write(
41                serverpcSingleton1.getPcid());
42
43        //Поскольку serverPCBeanpPototypeScope
44        //имеет scope prototype ниже
45        //создадутся две ссылки на разные
46        //объекты serverPCBeanpPototypeScope.
47        //То есть при каждом вызове getBean создается
48        //новый объект serverPCBeanpPototypeScope
49        ServerPC serverpcPrototype =
50                context.getBean(
51                        "serverPCBeanpPototypeScope",ServerPC.class);
52        ServerPC serverpcPrototype1 =
53                context.getBean(
54                        "serverPCBeanpPototypeScope",ServerPC.class);
55
56        //Проверим правда ли обе ссылки ссылаются
57        //на разные объекты serverPCBeanpPototypeScope.
58        //Установим значение поля pcid
59        //у бина serverPCBeanpPototypeScope
60        //через ссылку serverpcPrototype,
61        serverpcPrototype.setPcid("1233425");
62        //и теперь извлеч это значение через
63        //ссылку serverpcPrototype1 не получится
64        //так как serverpcPrototype1 ссылается
65        //на другой объект.
66        resp.getWriter().write(
67                serverpcPrototype1.getPcid());
68    }
69}

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

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

Как видим выведено было pcid только у бина синглтона. Через первую ссылку на него serverpcSingleton мы установили значение поля pcid, а через вторую ссылку serverpcSingleton1 на него вывели это значение.

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

Теперь должно быть понятно что представляют собой скоупы. Остальные же скоупы демонстрировать не будем так как там ничего особо сложного нет.


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

Жизненный цикл Spring-бина

18
мин.

Similar Articles Icon
Divider

Конфигурация Spring бинов с помощью аннотаций

20
мин.

Similar Articles Icon
Divider

Аннотация @Autowired в Spring Framework

12
мин.

Similar Articles Icon