Логотип YeaHub

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

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

Тренажёр

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

Обучение

Навыки

Войти

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

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

© 2026 YeaHub

Документы

Медиа

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

Какие особенности у prototype-бинов?

Вопрос проверяет понимание prototype-бинов в Spring Framework и их отличий от singleton-бинов, что важно для управления состоянием и жизненным циклом объектов в контейнере.

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

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

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

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

Ключевые особенности prototype-бинов

  • Создание нового экземпляра при каждом запросе: Каждый вызов возвращает новый объект, что гарантирует изоляцию состояния.
  • Контейнер не управляет полным жизненным циклом: Spring инициализирует prototype-бин (вызывает методы @PostConstruct), но не вызывает методы уничтожения (например, @PreDestroy). Очистка ресурсов — задача клиентского кода.
  • Особенности внедрения зависимостей: Если singleton-бин зависит от prototype-бина, то prototype будет внедрён только один раз при создании singleton. Чтобы получать новый экземпляр при каждом обращении, можно использовать lookup-метод или провайдер (например, ObjectFactory).

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

Prototype-бин можно задать через аннотацию @Scope или XML-конфигурацию.

@Component
@Scope("prototype")
public class ShoppingCart {
    private List<String> items = new ArrayList<>();
    
    public void addItem(String item) {
        items.add(item);
    }
    
    public List<String> getItems() {
        return items;
    }
}

@Service
public class OrderService {
    // При каждом обращении будет новый ShoppingCart
    @Autowired
    private ObjectFactory<ShoppingCart> cartFactory;
    
    public ShoppingCart createNewCart() {
        return cartFactory.getObject();
    }
}

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

Prototype-бины полезны в сценариях, где объект должен быть неразделяемым и иметь короткое время жизни: пользовательские сессии, корзины покупок, DTO (Data Transfer Objects), объекты с временными данными (например, отчёты), или когда состояние объекта изменяется часто и не должно влиять на другие компоненты.

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

Уровень

  • Рейтинг:

    3

  • Сложность:

    5

Навыки

  • Spring

    Spring

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

#Spring

#prototype bean

#singleton bean

#dependency injection

#bean scope

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