Содержание
Инверсия управления и внедрение зависимостей в Spring
Инверсия управления зависимостями программных компонентов в Spring достигается за счёт использования так называемого контейнера, который создаёт необходимые компоненты и внедряет их в зависимые классы.
Работает это следующим образом. Если объекту какого-то класса для работы нужен объект другого класса (подразумевается, что данные объекты реализуют программную логику, а не являются носителями каких-то данных), например, сервису, обрабатывающему паспортные данные, нужен объект сервиса, умеющего ходить в МВД и проверять действительность самого паспорта, то этот обрабатывающий паспорта сервис никогда не создаёт экземпляр сервиса проверки самостоятельно с помощью конструктора или фабричного метода. Обрабатывающий паспорта сервис указывает контейнеру эту зависимость одним из следующих способов:
- Объявляет его аргументом своего конструктора
- Объявляет его аргументом фабричного метода
- Объявляет его своим полем
Подразумевается, что и объект класса-обработчика паспортов, и объект сервиса проверки, будут созданы контейнером Spring'а (именно контейнер выполнит оператор new для создания обоих объектов). И контейнер также позаботится о том, чтобы внутри объекта класса-обработчика была ссылка на объект класса, проверяющего действительность.
Основные пакеты
Классы, отвечающие за инверсию управления и внедрение зависимостей в Spring, расположены в следующих пакетах
- org.springframework.beans
- org.springframework.context
Контейнер
Базовый интерфейс, описывающий контейнер Spring'а, называется BeanFactory (Фабрика бинов). Он расширяется интерфейсом ApplicationContext (Контекст приложения), который расширяет функциональность контейнера до привычного всем уровня. Поэтому обычно, когда говорят о спринговом контейнере, который создаёт и внедряет зависимости, а также выполняет другой функционал, то имеют в виду ApplicationContext и его имплементации.
Так, помимо создания и внедрения компонентов, ApplicationContext предоставляет следующие функции:
- Интеграцию с Аспектно-ориентированными возможностями Spring'а
- Управление мультиязычными версиями сообщений в приложении
- Публикацию событий
- Предоставляет контексты, специфичные для разных типов приложений
Программные компоненты (Spring beans)
Если класс реализует какую-то программную логику, должен создаваться контейнером, внедряться в другие программные компоненты и, возможно, требует, чтобы в него были внедрены другие компоненты, то говорят, что объектом такого класса управляет Spring и он называется бином (Spring bean).