Ответ
Да, Spring предоставляет несколько механизмов для управления жизненным циклом бина (от создания до уничтожения).
Основные способы:
-
Аннотации JSR-250 (наиболее предпочтительный способ):
@Component public class MyService { @PostConstruct public void init() { // Вызывается после инъекции всех зависимостей. // Идеально для инициализации ресурсов. } @PreDestroy public void cleanup() { // Вызывается перед уничтожением бина при закрытии контекста. // Идеально для освобождения ресурсов (закрытие соединений и т.д.). } } -
Интерфейсы Spring Lifecycle:
@Component public class MyBean implements InitializingBean, DisposableBean { @Override public void afterPropertiesSet() { // Аналог @PostConstruct // Логика инициализации } @Override public void destroy() { // Аналог @PreDestroy // Логика очистки } } -
BeanPostProcessor (для продвинутого кастомизации): Позволяет вмешиваться в процесс инициализации любых бинов до/после их создания.
@Component public class CustomBeanPostProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { // Действия до вызова init-методов return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) { // Действия после вызова init-методов (например, создание прокси) return bean; } } -
XML-конфигурация (устаревший способ):
<bean class="com.example.MyBean" init-method="customInit" destroy-method="customDestroy"/>
Стандартный порядок вызова методов инициализации:
- Конструктор.
- Инъекция зависимостей (через
@Autowired/сеттеры). - Метод
postProcessBeforeInitializationвсехBeanPostProcessor. - Метод, помеченный
@PostConstruct, илиafterPropertiesSet(). - Метод
postProcessAfterInitializationвсехBeanPostProcessor. - При завершении контекста:
@PreDestroy→destroy().