Как можно управлять жизненным циклом бина в Spring?

«Как можно управлять жизненным циклом бина в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Да, управлять ключевыми этапами жизненного цикла бина в Spring можно, но не менять его полностью. Фреймворк предоставляет несколько механизмов для внедрения логики на этапах инициализации и уничтожения.

Основные способы:

  1. Аннотации JSR-250 (рекомендуемый способ):

    @Component
    public class MyService {
        @PostConstruct
        public void init() {
            // Выполняется после инъекции зависимостей
            System.out.println("Bean is initialized");
        }
        @PreDestroy
        public void cleanup() {
            // Выполняется перед уничтожением бина
            System.out.println("Bean is being destroyed");
        }
    }
  2. Интерфейсы Spring InitializingBean и DisposableBean:

    @Component
    public class MyService implements InitializingBean, DisposableBean {
        @Override
        public void afterPropertiesSet() {
            // Аналог @PostConstruct
        }
        @Override
        public void destroy() {
            // Аналог @PreDestroy
        }
    }
  3. Указание методов в конфигурации Java/XML:

    @Configuration
    public class AppConfig {
        @Bean(initMethod = "setup", destroyMethod = "teardown")
        public DataSource dataSource() {
            return new HikariDataSource();
        }
    }

Для полного и низкоуровневого контроля над процессом создания бинов можно реализовать интерфейс BeanPostProcessor. Это позволяет выполнять произвольную логику до и после инициализации каждого бина в контейнере.