Ответ вслух Middle Бины: скоупы и жизненный цикл спрашивают часто обновлено

Жизненный цикл бина и прокси

Вопрос

Расскажите жизненный цикл бина в Spring. На каком этапе появляются прокси и почему это важно?

Попробуйте сами

Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.

Показать ответ и разбор

Коротко

Сначала контейнер читает определения бинов, и BeanFactoryPostProcessor может их поменять, например подставить свойства. Затем для каждого бина: вызов конструктора с внедрением, внедрение в поля и сеттеры, Aware-колбэки.

Что должно прозвучать в ответе

  • BeanDefinition и BeanFactoryPostProcessor до создания

  • Конструктор, внедрение, Aware

  • BeanPostProcessor before, @PostConstruct, afterPropertiesSet, initMethod

  • BeanPostProcessor after: создание AOP-прокси

  • В конструкторе и @PostConstruct ещё нет прокси, вызовы через this

  • Уничтожение: @PreDestroy, DisposableBean, кроме prototype

Что могут спросить следом

  • Где выполнить код после полного старта приложения?
  • Как Spring получает ранние ссылки при циклах?

Разбор

Сначала контейнер читает определения бинов, и BeanFactoryPostProcessor может их поменять, например подставить свойства. Затем для каждого бина: вызов конструктора с внедрением, внедрение в поля и сеттеры, Aware-колбэки. Потом BeanPostProcessor-ы до инициализации, сама инициализация в порядке @PostConstruct, afterPropertiesSet, initMethod, и BeanPostProcessor-ы после инициализации. Именно на последнем шаге AbstractAutoProxyCreator заменяет бин прокси, если на нём есть @Transactional, @Async, @Cacheable или аспекты. Отсюда практический вывод: в конструкторе и в @PostConstruct мы работаем с голым объектом, транзакции и асинхронность там не сработают. Код после полного старта кладу в обработчик ApplicationReadyEvent. При закрытии контекста вызываются @PreDestroy и destroy-методы, кроме prototype-бинов, которые контейнер не отслеживает.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.