Gymterview
middle

Каков жизненный цикл Spring Bean?

Жизненный цикл Spring Bean – последовательность этапов от создания до уничтожения объекта в контейнере.

Полный жизненный цикл (для singleton-бина)

  1. Инстанцирование – контейнер создаёт экземпляр бина (через конструктор)
  2. Установка свойств – внедряются зависимости (через сеттеры, поля)
  3. BeanNameAware.setBeanName() – если бин реализует BeanNameAware
  4. BeanFactoryAware.setBeanFactory() – если реализует BeanFactoryAware
  5. ApplicationContextAware.setApplicationContext() – если реализует ApplicationContextAware
  6. BeanPostProcessor.postProcessBeforeInitialization() – для всех BeanPostProcessor
  7. @PostConstruct – вызов метода, помеченного аннотацией
  8. InitializingBean.afterPropertiesSet() – если реализует InitializingBean
  9. init-method – вызов пользовательского метода инициализации
  10. BeanPostProcessor.postProcessAfterInitialization() – здесь могут создаваться прокси (для @Transactional)
  11. Бин готов к использованию
  12. @PreDestroy – при закрытии контейнера
  13. DisposableBean.destroy() – если реализует DisposableBean
  14. destroy-method – вызов пользовательского метода уничтожения
Пример бина с callback-методами
@Component
public class MyBean implements InitializingBean, DisposableBean {

    @Autowired
    private SomeDependency dependency;

    @PostConstruct
    public void postConstruct() {
        System.out.println("3. @PostConstruct -- после внедрения зависимостей");
    }

    @Override
    public void afterPropertiesSet() {
        System.out.println("4. InitializingBean.afterPropertiesSet()");
    }

    @PreDestroy
    public void preDestroy() {
        System.out.println("6. @PreDestroy -- перед уничтожением");
    }

    @Override
    public void destroy() {
        System.out.println("7. DisposableBean.destroy()");
    }
}

BeanPostProcessor

Мощный механизм, позволяющий вмешаться в процесс создания каждого бина. Именно через BeanPostProcessor работают многие аннотации Spring (@Autowired, @Transactional, @Async):

Пример
@Component
public class CustomBeanPostProcessor implements BeanPostProcessor {

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) {
        return bean; // вызывается перед @PostConstruct
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) {
        return bean; // здесь можно обернуть бин в прокси
    }
}

На собеседовании: важно назвать ключевые этапы: конструктор -> внедрение зависимостей -> BeanPostProcessor (before) -> @PostConstruct -> BeanPostProcessor (after, тут прокси). Частая ошибка – использовать зависимости, внедрённые через поля, в конструкторе (они ещё не установлены). Для инициализации используйте @PostConstruct или конструкторное внедрение.