Область действия Bean

Тема дорожной карты · Spring Boot

Области действия Spring Bean определяют жизненный цикл и стратегию создания экземпляров бинов, управляемых Spring IoC-контейнером в Spring Boot-приложении. По умолчанию и наиболее часто используется область singleton, при которой Spring создаёт ровно один экземпляр бина на ApplicationContext и повторно использует его в каждой точке внедрения — что делает её подходящей для бесстатусных компонентов @Service и @Repository. Область prototype указывает Spring-контейнеру создавать новый экземпляр бина при каждом запросе, что подходит для объектов с состоянием или пользовательских объектов; она объявляется через @Scope("prototype") на классах @Component или методах @Bean в классе @Configuration. Для веб-приложений Spring Boot предоставляет дополнительные области: request (один экземпляр на HTTP-запрос), session (один экземпляр на HTTP-сессию) и application (один экземпляр на ServletContext), каждая из которых включается при наличии spring-webmvc и аннотации @Scope с параметром proxyMode = ScopedProxyMode.TARGET_CLASS при внедрении бинов с более узкой областью в синглтоны. Понимание областей действия Spring Bean необходимо для предотвращения скрытых ошибок конкурентного доступа и утечек памяти в Spring Boot-приложениях, особенно при смешивании компонентов с областями singleton и prototype.

Как это работает

Область действия Bean (Dependency Injection + Inversion of Control): Spring-контейнер инстанцирует + связывает ваши бины вместо new везде. @Component (и стереотипы @Service, @Repository, @Controller) маркируют класс как Spring-managed bean; @Bean-методы в @Configuration-классе производят явные бины. @Autowired инжектит зависимости. Bean scopes (singleton дефолт, prototype, request, session) контролируют lifetime. Lifecycle hooks (@PostConstruct, @PreDestroy) запускают init/cleanup.

Когда применять

Предпочитайте constructor injection (final поля + @RequiredArgsConstructor через Lombok) — immutable, тестируемо, fail fast на отсутствующих зависимостях. Field/setter injection только для legacy. Бины stateless; singleton + state = concurrent-баги. Не инжектьте ApplicationContext чтобы "найти" бины — это service locator + ломает IoC.

Типичные ошибки

Ловушки Область действия Bean: field injection (тяжело тестировать, скрывает constructor-зависимости); circular зависимости (Spring 3.x отклоняет по дефолту — фиксите дизайн); singleton-бины с mutable state (race conditions); @Autowired на non-final поле, переприсваиваемом позже (тихие баги).

Связанные понятия

Полезные ресурсы