junior
Что такое Spring-контейнер? В чём разница между BeanFactory и ApplicationContext?
Spring-контейнер (IoC-контейнер) – ядро Spring Framework, отвечающее за создание бинов, их конфигурирование и управление жизненным циклом. Контейнер читает метаданные конфигурации (аннотации, XML, Java-конфигурация) и на их основе создаёт и связывает объекты.
| Аспект | BeanFactory | ApplicationContext |
|---|---|---|
| Инициализация | Ленивая (lazy) – бины создаются при первом запросе | Жадная (eager) – singleton-бины создаются при запуске |
| Интернационализация | Нет | Да (MessageSource) |
| Публикация событий | Нет | Да (ApplicationEventPublisher) |
| Загрузка ресурсов | Нет | Да (ResourceLoader) |
| Интеграция с AOP | Нет | Да |
| Поддержка профилей | Нет | Да |
Пример
// BeanFactory -- базовый (редко используется напрямую)
BeanFactory factory = new XmlBeanFactory(new ClassPathResource("beans.xml"));
MyBean bean = factory.getBean(MyBean.class);
// ApplicationContext -- стандартный выбор
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
// Spring Boot создаёт ApplicationContext автоматически
SpringApplication.run(MyApplication.class, args);
Основные реализации ApplicationContext
AnnotationConfigApplicationContext– для Java-конфигурацииClassPathXmlApplicationContext– для XML-конфигурации из classpathFileSystemXmlApplicationContext– для XML из файловой системыWebApplicationContext– для веб-приложений
На собеседовании: в современных приложениях всегда используется ApplicationContext. BeanFactory оправдан только в средах с крайне ограниченными ресурсами. Частая ошибка – не знать, чем они отличаются, и сказать «это одно и то же».