middle
Каков жизненный цикл Spring Bean?
Жизненный цикл Spring Bean – последовательность этапов от создания до уничтожения объекта в контейнере.
Полный жизненный цикл (для singleton-бина)
- Инстанцирование – контейнер создаёт экземпляр бина (через конструктор)
- Установка свойств – внедряются зависимости (через сеттеры, поля)
BeanNameAware.setBeanName()– если бин реализуетBeanNameAwareBeanFactoryAware.setBeanFactory()– если реализуетBeanFactoryAwareApplicationContextAware.setApplicationContext()– если реализуетApplicationContextAwareBeanPostProcessor.postProcessBeforeInitialization()– для всех BeanPostProcessor@PostConstruct– вызов метода, помеченного аннотациейInitializingBean.afterPropertiesSet()– если реализуетInitializingBeaninit-method– вызов пользовательского метода инициализацииBeanPostProcessor.postProcessAfterInitialization()– здесь могут создаваться прокси (для@Transactional)- Бин готов к использованию
@PreDestroy– при закрытии контейнераDisposableBean.destroy()– если реализуетDisposableBeandestroy-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или конструкторное внедрение.