Получить доступ

Что такое Spring Bean?

JuniorБины и их жизненный циклSpring
Ещё спрашивают так:
  • Какой жизненный цикл у бина?
Коротко

Бин — объект, которым управляет контейнер Spring: создаёт, внедряет зависимости, инициализирует, оборачивает прокси и уничтожает при закрытии контекста.

  • Объявляется @Component и производными или методом @Bean
  • Цикл: создание → внедрение → Aware-колбэки → BeanPostProcessor → @PostConstruct → готов → @PreDestroy
  • По умолчанию singleton — один на контейнер

А ещё Объект, созданный через new, — не бин: на него не действуют @Transactional и внедрение

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Как появляется бин: сканирование классов с @Component, @Service, @Repository, @Controller; методы @Bean в @Configuration-классах; автоконфигурация Spring Boot.

Жизненный цикл (упрощённо):

  1. контейнер создаёт экземпляр (конструктор);
  2. внедряет зависимости (поля, сеттеры);
  3. вызывает Aware-интерфейсы (BeanNameAware, ApplicationContextAware);
  4. BeanPostProcessor.postProcessBeforeInitialization;
  5. инициализация: @PostConstruct, InitializingBean.afterPropertiesSet, initMethod;
  6. postProcessAfterInitialization — здесь создаются прокси (@Transactional, @Async, AOP);
  7. бин используется;
  8. при закрытии контекста — @PreDestroy, DisposableBean.destroy (для singleton).

Важно: в контейнере лежит часто не ваш объект, а прокси вокруг него — поэтому self-invocation не проходит через @Transactional. Объект, созданный вручную через new, контейнер не знает: ни внедрения, ни аспектов.

Что хотят услышать

  • Определение бина.
  • Способы объявления.
  • Этапы жизненного цикла.
  • Прокси и объекты через new — плюс.

Частые ошибки

  • Создавать сервисы через new и ждать работы @Transactional.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✗Любой Java-объект, созданный через new
  • ✓Объект, созданный и управляемый контейнером (создание, внедрение зависимостей, init/destroy)
  • ✗Только класс с аннотацией @Entity
  • ✗Поток выполнения внутри Spring

Что спросят дальше

  • Чем @PostConstruct отличается от InitializingBean?
  • Что такое BeanPostProcessor?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем