← Назад к вопросам

Что такое HQL?

2.0 Middle🔥 121 комментариев
#ORM и Hibernate#Базы данных и SQL

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# Жизненный цикл 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");
    }
}

Порядок вывода будет:

  1. Constructor
  2. BeanNameAware
  3. ApplicationContextAware
  4. @PostConstruct
  5. 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.