Scope bean-компонента управляет тем, сколько экземпляров создаёт контейнер и как долго они живут. Lifecycle callbacks позволяют выполнить код сразу после создания bean и прямо перед его уничтожением.
Scope bean-компонента управляет тем, сколько экземпляров создаёт контейнер и как долго они живут. Lifecycle callbacks позволяют выполнить код сразу после создания bean и прямо перед его уничтожением.
@Service // по умолчанию singleton — один общий OrderService на всё приложение
public class OrderService { }
@Component
@Scope("prototype") // свежий экземпляр при каждом getBean/inject
public class ReportBuilder { }
Классическая ловушка: внедрение prototype в singleton. Singleton связывается один раз, поэтому он навсегда удерживает единственный экземпляр prototype — обещание «новый каждый раз» ломается. Исправьте это с помощью @Lookup, ObjectProvider<ReportBuilder> или scoped-proxy.
@Component
public class ConnectionPool {
@PostConstruct // выполняется после внедрения зависимостей, до использования
public void open() { /* открываем сокеты, прогреваем кэши */ }
@PreDestroy // выполняется при корректном завершении контейнера (только singletons)
public void close() { /* освобождаем ресурсы */ }
}
Важно: Spring не вызывает @PreDestroy для prototype-бинов — он отдаёт их и перестаёт отслеживать, поэтому за их очистку отвечаете вы.
Это отделяет тех, кто относится к Spring как к магии, от тех, кто понимает контейнер. Баг «singleton, удерживающий prototype» — любимый сценарий на собеседовании, потому что он неочевиден и вызывает реальные продакшн-баги. Знание того, что singletons должны быть stateless и потокобезопасны (они разделяются между всеми потоками запросов), — практический вывод, который слушают интервьюеры.
Библиотека вопросов для IT-собеседований с подробными ответами — от Junior до Senior.
Поддержать