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

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

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

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

ServerPC serverpc = context.getBean(“serverPCBean”,ServerPC.class); ServerPC serverpc1 = context.getBean(“serverPCBean”,ServerPC.class);

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

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

Также есть:

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

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

applicationContext.xml:

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

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

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 context = new ClassPathXmlApplicationContext( “applicationContext.xml”); //Поскольку serverPCBeanpSingletonScope //имеет scope singleton ниже //создадутся две ссылки на один //и тот же объект serverPCBeanpSingletonScope. //То есть при каждом вызове getBean из context //извлекается один и тот же //объект serverPCBeanpPototypeScope ServerPC serverpcSingleton = context.getBean( “serverPCBeanpSingletonScope”,ServerPC.class); ServerPC serverpcSingleton1 = context.getBean( “serverPCBeanpSingletonScope”,ServerPC.class); //Проверим правда ли обе ссылки ссылаются //на один и тот же объект //serverPCBeanpSingletonScope. //Установим значение поля pcid //у бина serverPCBeanpSingletonScope //через ссылку serverpcSingleton, serverpcSingleton.setPcid(“1233425”); //и теперь извлечем его //через другую ссылку – serverpcSingleton1 resp.getWriter().write( serverpcSingleton1.getPcid()); //Поскольку serverPCBeanpPototypeScope //имеет scope prototype ниже //создадутся две ссылки на разные //объекты serverPCBeanpPototypeScope. //То есть при каждом вызове getBean создается //новый объект serverPCBeanpPototypeScope ServerPC serverpcPrototype = context.getBean( “serverPCBeanpPototypeScope”,ServerPC.class); ServerPC serverpcPrototype1 = context.getBean( “serverPCBeanpPototypeScope”,ServerPC.class); //Проверим правда ли обе ссылки ссылаются //на разные объекты serverPCBeanpPototypeScope. //Установим значение поля pcid //у бина serverPCBeanpPototypeScope //через ссылку serverpcPrototype, serverpcPrototype.setPcid(“1233425”); //и теперь извлеч это значение через //ссылку serverpcPrototype1 не получится //так как serverpcPrototype1 ссылается //на другой объект. resp.getWriter().write( serverpcPrototype1.getPcid()); } }

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

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

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

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

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

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

Изучите жизненный цикл Spring-бина: создание через BeanFactory, внедрение зависимостей, вызов init/destroy методов. Практический пример с XML-конфигурацией и сервлетом.
Time to read: 18

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

Spring аннотации для конфигурации бинов: @Component, @Autowired, @Value. Узнайте как заменить XML на аннотации в Spring Framework для упрощения разработки.
Time to read: 20

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

Изучите мощь аннотации @Autowired в Spring - внедрение зависимостей без конструкторов и сеттеров. Практический гайд по автоматическому связыванию компонентов.
Time to read: 12