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

Какие знаешь этапы запуска контекста Spring?

2.0 Middle🔥 91 комментариев
#Spring Framework

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

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

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

Этапы запуска контекста Spring

Spring контекст — это ядро фреймворка, которое отвечает за управление бинами (beans), их жизненным циклом и зависимостями между ними. При запуске приложения контекст проходит через несколько критических этапов, которые нужно хорошо понимать.

1. Инициализация BeanFactory

Первый этап — создание BeanFactory, который является основой для управления бинами. Это базовый интерфейс для доступа к бинам в контексте.

BeanFactory beanFactory = new DefaultListableBeanFactory();

На этом этапе создаётся пустой контейнер, готовый к регистрации определений бинов.

2. Загрузка конфигурации (Configuration Loading)

Spring читает конфигурацию из разных источников:

  • XML файлы (spring-config.xml)
  • Java классы с аннотацией @Configuration
  • Properties файлы для externalizing конфигурации
  • Аннотации в классах (@Component, @Service, @Repository)
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

Each configuration source is parsed and stored as bean definitions.

3. BeanDefinition Registration

Все найденные классы и конфигурации преобразуются в BeanDefinition объекты. Эти объекты содержат метаинформацию о каждом бине:

  • Класс бина
  • Scope (singleton, prototype, request, session)
  • Зависимости (dependencies)
  • Параметры инициализации
public class BeanDefinitionExample {
    // BeanDefinition содержит:
    // - beanClass = UserService.class
    // - scope = "singleton"
    // - dependencies = [UserRepository]
}

4. BeanFactoryPostProcessor

После регистрации всех BeanDefinitions но ДО создания самих бинов, вызываются BeanFactoryPostProcessor:

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory);
}

Это позволяет изменять определения бинов перед их инстанцированием. Например, PropertyPlaceholderConfigurer заменяет ${placeholder} на реальные значения.

5. Инстанцирование бинов (Bean Instantiation)

В этот момент Spring создаёт экземпляры всех singleton бинов (prototype создаются по требованию). Для каждого бина:

  • Вызывается конструктор
  • Устанавливаются свойства (dependency injection через setter или конструктор)
  • Вызываются методы инициализации
UserService userService = new UserService(userRepository);

6. Dependency Injection

Внедрение зависимостей — критический этап. Spring использует несколько стратегий:

  • Constructor Injection — самая безопасная
  • Setter Injection — через @Autowired
  • Field Injection — прямое внедрение в поля (не рекомендуется)
@Service
public class UserService {
    private UserRepository repository;

    public UserService(UserRepository repository) {
        this.repository = repository;
    }
}

7. BeanPostProcessor

После создания бина но ДО того как он полностью инициализирован, вызываются BeanPostProcessor:

public interface BeanPostProcessor {
    Object postProcessBeforeInitialization(Object bean, String beanName);
    Object postProcessAfterInitialization(Object bean, String beanName);
}

Это используется для прокси-объектов (например, в AOP) и кастомной инициализации.

8. Инициализация методов

Вызываются методы инициализации:

  • Методы с аннотацией @PostConstruct
  • Методы afterPropertiesSet() из InitializingBean
  • Методы init-method из XML конфигурации
@Service
public class UserService implements InitializingBean {
    @PostConstruct
    public void init() {
        System.out.println("Bean инициализирован");
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("InitializingBean вызван");
    }
}

9. Готовность контекста

После создания и инициализации всех singleton бинов контекст считается полностью инициализированным. На этом этапе вызываются ContextRefreshedEvent слушатели.

10. Завершение (Shutdown)

При остановке приложения Spring вызывает методы уничтожения в обратном порядке:

  • Методы с @PreDestroy
  • Методы destroy() из DisposableBean
  • Методы destroy-method из конфигурации
@Service
public class UserService implements DisposableBean {
    @PreDestroy
    public void cleanup() {
        System.out.println("Очистка ресурсов");
    }
}

Полный жизненный цикл

Резюме в порядке выполнения:

  1. BeanFactory creation
  2. Configuration loading
  3. BeanDefinition registration
  4. BeanFactoryPostProcessor вызов
  5. Bean instantiation
  6. Dependency injection
  7. BeanPostProcessor.postProcessBeforeInitialization
  8. @PostConstruct / InitializingBean
  9. BeanPostProcessor.postProcessAfterInitialization
  10. Context ready (ContextRefreshedEvent)
  11. Application shutdown (PreDestroy / DisposableBean)

Понимание этих этапов критично для эффективной работы с Spring, особенно при отладке проблем с инициализацией и циклических зависимостей.