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

Какие знаешь реализации ApplicationContext?

2.0 Middle🔥 111 комментариев
#Основы Java

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

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

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

Реализации ApplicationContext в Spring Framework

ApplicationContext — это центральный интерфейс Spring Framework, представляющий IoC контейнер. Он отвечает за создание, конфигурирование и управление бинами (bean объектами). Существует несколько важных реализаций.

1. ClassPathXmlApplicationContext

Загружает конфигурацию из XML файла в classpath.

// Загрузка из classpath
ApplicationContext context = new ClassPathXmlApplicationContext(
    "classpath:application-context.xml"
);

UserService userService = context.getBean(UserService.class);

XML конфигурация:

<beans xmlns="http://www.springframework.org/schema/beans">
    <bean id="userService" class="com.example.UserService">
        <property name="userRepository" ref="userRepository" />
    </bean>
    
    <bean id="userRepository" class="com.example.UserRepository" />
</beans>

Характеристики:

  • Синхронная загрузка конфигурации
  • Автоматическое закрытие ресурсов (implements Closeable)
  • Подходит для простых приложений
  • В современных приложениях используется редко

2. FileSystemXmlApplicationContext

Загружает конфигурацию из файловой системы (не из classpath).

// Загрузка с диска
ApplicationContext context = new FileSystemXmlApplicationContext(
    "file:/etc/spring/application-context.xml"
);

Отличия от ClassPathXmlApplicationContext:

  • Ищет файлы в файловой системе, а не в classpath
  • Используется для конфигураций, не входящих в jar файл
  • Пример: конфиги на production сервере

3. AnnotationConfigApplicationContext

Загружает конфигурацию из Java классов с аннотациями (современный подход).

// Java конфигурация
@Configuration
public class ApplicationConfig {
    
    @Bean
    public UserRepository userRepository() {
        return new UserRepositoryImpl();
    }
    
    @Bean
    public UserService userService(UserRepository userRepository) {
        return new UserService(userRepository);
    }
}

// Инициализация контекста
ApplicationContext context = new AnnotationConfigApplicationContext(
    ApplicationConfig.class
);

UserService service = context.getBean(UserService.class);

Характеристики:

  • Полностью основана на Java коде
  • Компилируется в типобезопасной среде
  • @Configuration, @Bean, @ComponentScan аннотации
  • Стандарт в современных Spring приложениях
  • Type-safe конфигурация

4. GenericApplicationContext

Универсальная реализация для программного создания бинов.

GenericApplicationContext context = new GenericApplicationContext();

// Программное регистрирование бинов
context.registerBean(UserRepository.class);
context.registerBean(UserService.class, UserRepository.class);

// Инициализация контекста
context.refresh();

UserService service = context.getBean(UserService.class);

Применение:

  • Создание контекста в тестах
  • Динамическое добавление бинов во время выполнения
  • Программная конфигурация

5. WebApplicationContext (Для веб приложений)

AnnotationConfigWebApplicationContext

// В конфигурации Tomcat/Spring MVC
@Configuration
@EnableWebMvc
public class WebConfig {
    // Конфигурация контроллеров, view resolvers и т.д.
}

// Инициализация в web.xml эквиваленте
public class WebApplicationInitializer implements WebApplicationInitializer {
    @Override
    public void onStartup(ServletContext servletContext) {
        AnnotationConfigWebApplicationContext context = 
            new AnnotationConfigWebApplicationContext(WebConfig.class);
        
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistration.Dynamic registration = 
            servletContext.addServlet("dispatcher", servlet);
        registration.setLoadOnStartup(1);
        registration.addMapping("/");
    }
}

Характеристики:

  • Расширяет ApplicationContext для веб приложений
  • Управляет ServletContext
  • Имеет доступ к Request scope бинов

6. ReactiveWebApplicationContext (Для реактивных приложений)

// Spring WebFlux конфигурация
@Configuration
@EnableWebFlux
public class WebFluxConfig implements WebFluxConfigurer {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

Сравнительная таблица

РеализацияКонфигурацияТип приложенияКогда использовать
ClassPathXmlApplicationContextXMLStandaloneLegacy приложения
FileSystemXmlApplicationContextXML (filesystem)StandaloneКонфиги вне jar
AnnotationConfigApplicationContextJava аннотацииStandaloneСовременные приложения
GenericApplicationContextПрограммнаяТестированиеДинамическая конфигурация
AnnotationConfigWebApplicationContextJava аннотацииWeb (Spring MVC)Web приложения
ReactiveWebApplicationContextJava аннотацииReactive (WebFlux)Асинхронные приложения

Иерархия контекстов в Spring Boot

// Spring Boot автоматически создаёт:
// 1. Parent Context (родительский) — для общих бинов
// 2. Child Context (дочерний) — для сервлета/контроллеров

// Это позволяет разделить конфигурацию

Практический пример: современное приложение

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        // Spring Boot автоматически создаёт AnnotationConfigApplicationContext
        ApplicationContext context = SpringApplication.run(Application.class, args);
        
        // Теперь можно получать бины
        UserService userService = context.getBean(UserService.class);
    }
}

@Configuration
public class AppConfig {
    @Bean
    public UserService userService(UserRepository repository) {
        return new UserService(repository);
    }
}

Выбор правильной реализации

  • Spring Boot приложение? → Не беспокойся, Spring Boot выбирает автоматически
  • Java конфигурация? → AnnotationConfigApplicationContext
  • XML конфигурация? → ClassPathXmlApplicationContext
  • Тестирование? → GenericApplicationContext
  • Веб приложение? → AnnotationConfigWebApplicationContext
  • WebFlux/реактив? → ReactiveWebApplicationContext

Аппликационный контекст — это сердце Spring Framework, управляющее жизненным циклом объектов и их зависимостями.