Какие знаешь реализации ApplicationContext?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Реализации 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();
}
}
Сравнительная таблица
| Реализация | Конфигурация | Тип приложения | Когда использовать |
|---|---|---|---|
| ClassPathXmlApplicationContext | XML | Standalone | Legacy приложения |
| FileSystemXmlApplicationContext | XML (filesystem) | Standalone | Конфиги вне jar |
| AnnotationConfigApplicationContext | Java аннотации | Standalone | Современные приложения |
| GenericApplicationContext | Программная | Тестирование | Динамическая конфигурация |
| AnnotationConfigWebApplicationContext | Java аннотации | Web (Spring MVC) | Web приложения |
| ReactiveWebApplicationContext | Java аннотации | 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, управляющее жизненным циклом объектов и их зависимостями.