Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
# Жизненный цикл Bean в Spring Framework
Жизненный цикл Spring Bean - один из самых важных концептов в Spring. Это сложный процесс от создания до уничтожения, состоящий из нескольких этапов.
Этапы жизненного цикла
1. Instantiation (Создание экземпляра)
Spring использует конструктор (default или параметризированный) для создания объекта:
@Component
public class MyBean {
public MyBean() {
System.out.println("1. Bean создан (constructor)");
}
}
2. Populating Properties (Заполнение свойств)
Spring устанавливает значения свойств через Dependency Injection:
@Component
public class MyBean {
@Autowired
private SomeService service;
private String name;
// Spring установит значения полей
}
3. BeanNameAware callback
Если Bean реализует BeanNameAware, вызывается setBeanName():
@Component
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("2. BeanName: " + name);
}
}
4. BeanFactoryAware callback
Если Bean реализует BeanFactoryAware, вызывается setBeanFactory():
@Component
public class MyBean implements BeanFactoryAware {
@Override
public void setBeanFactory(BeanFactory beanFactory) {
System.out.println("3. BeanFactory установлена");
}
}
5. ApplicationContextAware callback
Если Bean реализует ApplicationContextAware:
@Component
public class MyBean implements ApplicationContextAware {
@Override
public void setApplicationContext(ApplicationContext context) {
System.out.println("4. ApplicationContext установлен");
}
}
6. BeanPostProcessor - postProcessBeforeInitialization
Вызывается перед инициализацией:
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) {
System.out.println("5. Before initialization: " + beanName);
return bean;
}
}
7. InitializingBean callback или @PostConstruct
Вызывается при инициализации Bean:
@Component
public class MyBean implements InitializingBean {
@Override
public void afterPropertiesSet() {
System.out.println("6. Bean инициализирован (InitializingBean)");
}
}
// ИЛИ через аннотацию
@Component
public class MyBean {
@PostConstruct
public void init() {
System.out.println("6. Bean инициализирован (@PostConstruct)");
}
}
8. custom-init-method
Если указан custom init method:
@Bean(initMethod = "customInit")
public MyBean myBean() {
return new MyBean();
}
public class MyBean {
public void customInit() {
System.out.println("7. Custom init method");
}
}
9. BeanPostProcessor - postProcessAfterInitialization
Вызывается после инициализации:
@Component
public class MyBeanPostProcessor implements BeanPostProcessor {
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
System.out.println("8. After initialization: " + beanName);
return bean;
}
}
10. Bean готов к использованию
Bean теперь полностью инициализирован и готов к использованию.
11. DisposableBean или @PreDestroy
Вызывается при завершении работы контейнера:
@Component
public class MyBean implements DisposableBean {
@Override
public void destroy() {
System.out.println("9. Bean уничтожается (DisposableBean)");
}
}
// ИЛИ через аннотацию
@Component
public class MyBean {
@PreDestroy
public void cleanup() {
System.out.println("9. Bean уничтожается (@PreDestroy)");
}
}
12. custom-destroy-method
Если указан custom destroy method:
@Bean(destroyMethod = "customDestroy")
public MyBean myBean() {
return new MyBean();
}
public class MyBean {
public void customDestroy() {
System.out.println("10. Custom destroy method");
}
}
Полный пример
@Component
public class CompleteLifecycleBean implements BeanNameAware,
ApplicationContextAware, InitializingBean, DisposableBean {
public CompleteLifecycleBean() {
System.out.println("1. Constructor - объект создан");
}
@Autowired
private SomeService service;
@Override
public void setBeanName(String name) {
System.out.println("2. BeanNameAware.setBeanName: " + name);
}
@Override
public void setApplicationContext(ApplicationContext context) {
System.out.println("3. ApplicationContextAware.setApplicationContext");
}
@PostConstruct
public void postConstruct() {
System.out.println("4. @PostConstruct");
}
@Override
public void afterPropertiesSet() {
System.out.println("5. InitializingBean.afterPropertiesSet");
}
@PreDestroy
public void preDestroy() {
System.out.println("6. @PreDestroy");
}
@Override
public void destroy() {
System.out.println("7. DisposableBean.destroy");
}
}
Порядок вывода будет:
- Constructor
- BeanNameAware
- ApplicationContextAware
- @PostConstruct
- InitializingBean 6-7. Destruction
Scope влияет на жизненный цикл
- Singleton: объект создается один раз и живет все время
- Prototype: создается новый объект при каждом request
- Request/Session: создается для каждого request/session
Для Prototype scope destroy callbacks не вызываются.
Лучшие практики
- Используй @PostConstruct для инициализации
- Используй @PreDestroy для очистки ресурсов
- Избегай InitializingBean и DisposableBean интерфейсов (устаревает)
- Используй ленивую инициализацию (@Lazy) когда нужно
- Помни о cyclic dependencies
Понимание жизненного цикла Bean критично для эффективной работы со Spring.