Dependency Injection в Spring

Внедрение зависимости (DI — Dependency injection) — это процесс предоставления программному компоненту внешней зависимости. Согласно принципу единой обязанности, объект передает "заботу" о построении нужных ему зависимостей внешнему механизму, который специально для этого предназначен.

Каковы достоинства применения Dependency Injection и как DI реализуется в Spring?

Основные плюсы внедрения зависимости следующие: • сокращается объем связующего кода. Это одно из самых главных преимуществ, так как существенно уменьшается объем кода, который надо написать для связывания между собой разных компонентов приложения. Чаще всего этот код весьма прост — в процессе создания зависимости должен создаваться новый экземпляр соответствующего объекта; • упрощается конфигурация приложения. Благодаря применению Dependency Injection, процесс конфигурирования приложения существенно облегчается. В целях конфигурирования классов, которые можно внедрять в другие классы, используют аннотации либо файлы XML; • появляется возможность управлять общими зависимостями в одном репозитории. Когда речь идет о традиционном подходе к управлению зависимостями в общих службах (удаленные службы, транзакция, подключение к источнику данных и т. п.), разработчик создает экземпляры зависимостей (либо получает их из фабричных классов) там, где они действительно нужны, то есть внутри зависимого класса. Результат — распространение зависимостей по множеству классов в программном приложении, что, как известно, способно затруднить их изменение. Если же использовать DI, то вся информация об общих зависимостях находится в одном репозитории (в Spring можно хранить данную информацию в XML-файлах либо Java-классах), что значительно упрощает процесс управления зависимостями, и, как следствие, уменьшает число возможных ошибок; • улучшается возможность тестирования. Если классы проектируются для DI, появляется возможность простой замены зависимостей. Это весьма полезно при тестировании; • стимулируются качественные проектные решения. Собственно говоря, проектирование для Dependency Injection — это проектирование с применением интерфейсов. Используя Spring, разработчик получает в свое распоряжение широкий спектр DI-средств, поэтому он может сосредоточить свои силы на построении логики программного приложения, а не на платформе, поддерживающей DI.

Реализация DI в Spring Framework

Реализация в Spring основана на 2-х ключевых Java-концепциях: интерфейсах и компонентах JavaBean. Используя Spring в качестве поставщика DI, разработчик получает гибкость определения конфигурации зависимостей внутри приложений разными путями: — внешне в XML-файлах; — посредством конфигурационных Java-классов Spring; — с помощью Java-аннотаций в коде).

Компоненты JavaBean (их еще называют Plain Old Java Object (POJO) — старый добрый объект Java) предоставляют стандартный механизм, позволяющий создавать Java-ресурсы, конфигурируемыми множеством способов. Благодаря применению Dependency Injection, объем кода, необходимого при проектировании программного приложения на основе интерфейсов, уменьшается почти до нуля. Вдобавок к этому, посредством интерфейсов вы можете получить наибольшую отдачу от DI, ведь бины способны использовать для удовлетворения их зависимости любую реализацию интерфейса.

Типы реализации

К типам реализации DI в Spring относятся: Constructor Dependency Injection. Зависимости компонента предоставляются ему в его конструкторе (конструкторах).

Setter Dependency Injection. IoC-контейнер внедряет зависимости компонента в компонент, используя методы установки в стиле JavaBean.

Источник