Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Java: Spring, prototype scope, bean, dependency injection, application context

Что такое prototype scope в Spring?

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

Короткий ответ

Prototype scope — это одна из областей видимости бинов в Spring Framework. Когда бин объявлен с областью prototype, контейнер Spring создаёт новый экземпляр этого бина каждый раз, когда он запрашивается через контекст приложения или внедряется в другой бин. Это отличается от singleton scope, где создаётся только один экземпляр на весь контекст. Prototype полезен, когда состояние бина не должно разделяться между разными частями приложения.

Длинный ответ

В Spring Framework область видимости (scope) определяет жизненный цикл и видимость бина в контейнере. По умолчанию все бины имеют область singleton, что означает один экземпляр на контейнер. Prototype scope — это альтернатива, при которой Spring создаёт новый экземпляр объекта каждый раз, когда требуется этот бин.

Как работает Prototype Scope

Когда вы запрашиваете бин с областью prototype (например, через applicationContext.getBean() или при внедрении зависимости), контейнер Spring инициирует процесс создания нового экземпляра. Это включает вызов конструктора, внедрение зависимостей и вызов методов инициализации, если они определены. Контейнер не управляет полным жизненным циклом prototype-бинов — после создания и передачи клиенту контейнер больше не отслеживает их, и методы уничтожения не вызываются автоматически.

Где применяется Prototype Scope

  • Состояние, уникальное для каждого запроса: Например, бин, представляющий корзину покупок в веб-приложении, должен быть уникальным для каждой сессии пользователя.
  • Объекты с изменяемым состоянием: Если бин содержит данные, которые изменяются в ходе операции, и эти изменения не должны влиять на другие части приложения.
  • Ресурсоёмкие объекты, создаваемые по требованию: Хотя prototype создаёт новый экземпляр при каждом запросе, это не всегда эффективно для тяжёлых объектов — в таких случаях可以考虑 другие подходы, например, пулы объектов.

Пример объявления и использования

Prototype scope можно задать аннотацией @Scope или через XML-конфигурацию. Рассмотрим пример с аннотациями:

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("prototype")
public class PrototypeService {
    private String data;
    
    public void setData(String data) {
        this.data = data;
    }
    
    public String getData() {
        return data;
    }
}

// В другом компоненте
@Component
public class ClientComponent {
    private final PrototypeService prototypeService;
    
    // При каждом внедрении будет создан новый экземпляр PrototypeService
    public ClientComponent(PrototypeService prototypeService) {
        this.prototypeService = prototypeService;
    }
    
    public void useService() {
        prototypeService.setData("some data");
        System.out.println(prototypeService.getData());
    }
}

Важно помнить: если singleton-бин внедряет prototype-бин, то prototype будет создан только один раз при инициализации singleton. Чтобы каждый раз получать новый экземпляр, можно использовать lookup-метод или провайдер (например, ObjectFactory или Provider).

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Java

    Java

  • Spring

    Spring

Ключевые слова

#Spring

#prototype scope

#bean

#dependency injection

#application context

Подпишись на Java Developer в телеграм