Ключевым элементом Spring Framework является Spring Container. Container создаёт объекты, связывает их вместе, настраивает и управляет ими от создания до момента уничтожения.
Для управления компонентами, из которых состоит приложение, Spring Container использует Внедрение Зависимостей (DI). Эти объекты называются Spring Beans, которые мы обсудим далее.
Spring Container получает инструкции какие объекты инстанциировать и как их конфигурировать через метаданные.
Метаданные могут быть получены 3 способами:
– XML
– Аннотации Java
– Java код
На картинке, которая находится выше схематично показан этот процесс.
Java POJO классы поступает в Spring Container, который на основании инструкций, полученных через метаданные, выдаёт приложение, готовое к использованию.
В Spring имеется 2 различных вида контейнеров:
1. Spring BeanFactory Container;
2. Spring ApplicationContext Container;
Spring BeanFactory Container
Это самый простой контейнер, обеспечивающий базовую поддержку DI и который основан на интерфейсе org.springframework.beans.factory.BeanFactory. Такие интерфейсы, как BeanFactoryAware и DisposableBean всё ещё присутствуют в Spring для обеспечения обратной совместимости.
Наиболее часто используемая реализация интерфейса BeanFactory – XmlBeanFactory.
XmlBeanFactory получает метаданные из конфигурационного XML файла и использует его для создания настроенного приложения или системы.
BeanFactory обычно используется тогда, когда ресурсы ограничены (мобильные устройства). Поэтому, если ресурсы не сильно ограничены, то лучше использовать ApplicationContext.
Пример
Создайте Spring проект в IntellijIdea (Пункт №1 из “Руководство по Spring. Создание простого приложения.”)
Структура проекта:
Класс Message.java
Конфигурационный файл message-bean.xml
Класс MessageRunnerWithBeanFactory.java
Результат работы программы
Исходный код проекта по ЭТОЙ ССЫЛКЕ.
Spring ApplicationContext Container
ApplicationContext является более сложным и более продвинутым Spring Container-ом. Так же, как BeanFactory, ApplicationContext загружает бины, связывает их вместе и конфигурирует их определённым образом. Но кроме этого, ApplicationContext обладает дополнительной функциональностью: распознание текстовых сообщений из файлов настройки и отображение событий, которые происходят в приложении различными способами. Этот контейнер определяется интерфейсом org.springframework.context.ApplicationContext.
Чаще всего используются следующие реализации AppicationContext:
– FileSystemXmlApplicationContext
Загружает данные о бине из XML файла. При использовании этой реализации в конструкторе необходимо указать полный адрес конфигурационного файла.
– ClassPathXmlApplicationContext
Этот контейнер также получает данные о бине из XML файла. Но в отличие от FileSystemApplicationContext, в этом случае необходимо указать относительный адрес конфигурационного файла (CLASSPATH).
– WebXmlApplicationContext
Эта реализация ApplicationContext получает необходимую информацию из веб-приложения.
В примере создания простого Spring приложения мы уже использовали ClassPathXmlApplicationContext. Теперь мы попробуем использовать FileSystemXmlApplicationContext.
Пример
Создайте Spring проект в IntellijIdea (Пункт №1 из “Руководство по Spring. Создание простого приложения.”)
Структура проекта:
Класс Message.java
Конфигурационный файл message-bean.xml
Класс MessageRunnerWithFileSystemApplicationContext.java
Результат работы программы
Исходный код проекта доступен по ЭТОЙ ССЫЛКЕ.
Заключение
Как мы увидели из этого руководства – контейнер ApplicationContext обладает большей функциональностью, чем BeanFactory, поэтому если мы не находимся в условиях крайней ограниченности ресурсов, более предпочтительным является использование ApplicationContext.