Сколько живет бин в Spring?
Что проверяют
Формально это вопрос про области видимости, но тестировщику его задают не ради определения. Смотрят, понимаете ли вы, почему автотест на Spring падает через раз: контекст переиспользуется, синглтон один на всех, и состояние из соседнего теста доезжает до вашего.
Как отвечать
Время жизни бина задаётся его областью видимости:
singletonпо умолчанию: один экземпляр на контейнер, создаётся при старте контекста и живёт, пока жив контекст;prototype: новый экземпляр на каждое обращение. Контейнер отдаёт его и дальше им не управляет, поэтому метод уничтожения для прототипа не вызывается вовсе;request,session,applicationв веб-контексте: на один запрос, на сессию пользователя, на всё приложение.
Жизненный цикл синглтона по шагам: создание, внедрение зависимостей, обработка через BeanPostProcessor, @PostConstruct, работа, @PreDestroy при закрытии контекста.
Дальше переводите разговор на тесты. Spring Test кэширует контекст и переиспользует его между тест-классами с одинаковой конфигурацией, так что один и тот же синглтон обслуживает весь прогон. Любая мутация состояния внутри бина становится мусором для следующих тестов. Инструменты: @DirtiesContext, чтобы выбросить испорченный контекст, @Transactional на тесте для отката данных, подмена бина мок-объектом. Про подмену помните, что она создаёт отдельный ключ кэша и отдельный контекст, из-за чего прогон разрастается.
Где спотыкаются
Отвечают «бин живёт, пока живёт приложение», и останавливаются. Это верно только для синглтона: про прототип забывают вместе с тем, что за его закрытием никто не следит и ресурсы внутри придётся закрывать самому.
Второе: внедряют прототип в синглтон и ждут нового экземпляра на каждый вызов. Зависимость подставляется один раз при создании синглтона, дальше это тот же объект, а за новым нужно идти через ObjectProvider или прокси области видимости.
Третье: чинят флакующие тесты, вешая сброс контекста на каждый класс. Тесты зеленеют, но прогон становится в разы дольше, потому что контекст поднимается заново. Правильнее убирать из бина изменяемое состояние.