Жизненный цикл бина и прокси
Вопрос
Расскажите жизненный цикл бина в Spring. На каком этапе появляются прокси и почему это важно?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
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 ошибок.