Обзор
Эта статья поможет вам понять и создать легкое Java-приложение, используя вашу собственную реализацию внедрения зависимостей.
Внедрение зависимостей … ДИ… Инверсия Управления…МоК, я думаю, вы, возможно, слышали эти имена так много раз во время вашей обычной рутины или специально во время подготовки к собеседованию, что вам интересно, что именно это такое.
Но если вы действительно хотите понять, как это работает внутри, тогда продолжайте читать здесь.
Итак, что такое внедрение зависимостей?
Внедрение зависимостей – это шаблон проектирования, используемый для реализации IoC, в котором переменные экземпляра (т.е. зависимости) объекта создаются и назначаются фреймворком.
Чтобы использовать DI, используйте класс и это переменные экземпляра, просто нужно добавить аннотации, предопределенные фреймворком.
Шаблон внедрения зависимостей включает в себя 3 типа классов.
- Класс клиента : Класс клиента (зависимый класс) зависит от класса обслуживания.
- Класс обслуживания : Класс обслуживания (класс зависимостей), который предоставляет обслуживание клиентскому классу.
- Класс инжектора : Класс инжектора вводит объект класса обслуживания в класс клиента.
Таким образом, шаблон DI отделяет ответственность за создание объекта класса service от класса client. Ниже приведена еще пара терминов, используемых в DI.
- Интерфейсы , которые определяют, как клиент может использовать сервисы.
- Внедрение относится к передаче зависимости (службы) в объект (клиент), это также называется автозапуском.
Итак, что такое Инверсия контроля?
Короче говоря, “Не звоните нам, мы сами вам позвоним”.
- Инверсия управления (IoC) – это принцип проектирования. Он используется для инвертирования различных видов элементов управления (т.Е. создания объектов или создания и привязки зависимых объектов) в объектно-ориентированном проектировании для достижения слабой связи.
- Внедрение зависимостей – один из подходов к реализации IoC.
- IoC помогает отделить выполнение задачи от реализации.
- IoC помогает ему сфокусировать модуль на задаче, для которой он предназначен.
- IoC предотвращает побочные эффекты при замене модуля.
Диаграмма классов шаблона проектирования внедрения зависимостей:
На приведенной выше диаграмме классов класс Client, для которого требуются объекты User Service и Account Service, не создает экземпляры классов UserServiceImpl и AccountServiceImpl напрямую.
Вместо этого класс инжектора создает объекты и вводит их в Клиент, что делает клиент независимым от того, как создаются объекты.
Типы внедрения зависимостей
- Внедрение конструктора : инжектор предоставляет услугу (зависимость) через конструктор клиентского класса. В этом случае автоматически подключаемая аннотация добавляется в конструктор.
- Внедрение свойств : инжектор предоставляет услугу (зависимость) через общедоступное свойство класса client. В этом случае автоматически подключаемая аннотация добавляется при объявлении переменной-члена.
- Внедрение метода Setter : клиентский класс реализует интерфейс, который объявляет метод(ы) для предоставления услуги (зависимости), и инжектор использует этот интерфейс для предоставления зависимости клиентскому классу.
В этом случае автоматически подключаемая аннотация добавляется при объявлении метода.
Как это работает?
Чтобы понять реализацию внедрения зависимостей, обратитесь к фрагментам кода здесь или загрузите/клонируйте учебное пособие, размещенное здесь, на GitHub.
Предпосылка
Для лучшего понимания этого руководства полезно заранее иметь базовые знания о аннотациях и рефлексии.
Необходимые библиотеки Java
Прежде чем приступить к этапам кодирования, вы можете создать новый проект maven в eclipse и добавить зависимость ядра Burning wave в pom.xml :
Создание пользовательских аннотаций
Как описано выше, реализация DI должна предоставлять предопределенные аннотации, которые могут использоваться при объявлении клиентского класса и служебных переменных внутри клиентского класса.
Давайте добавим базовые аннотации, которые могут использоваться классами client и service:
Интерфейсы обслуживания
Классы обслуживания
Эти классы реализуют сервисные интерфейсы и используют аннотации DI.
Класс клиента
Для использования функций DI клиентский класс должен использовать предопределенные аннотации, предоставляемые DI framework для класса client и service.
Класс инжектора
Класс инжектора играет важную роль в структуре DI. Потому что он отвечает за создание экземпляров всех клиентов и экземпляров autowire для каждой службы в клиентских классах. Шаги:
- Просканируйте все клиенты под корневым пакетом и все вложенные пакеты
- Создайте экземпляр клиентского класса.
- Сканирование всех служб, используемых в клиентском классе (переменные-члены, параметры конструктора, параметры метода)
- Проверка всех служб, объявленных внутри самой службы (вложенные зависимости), рекурсивно
- Создайте экземпляр для каждой службы, возвращенной на шаге 3 и шаге 4
- Автозапуск: Ввод (т.е. инициализация) каждой службы с помощью экземпляра, созданного на шаге 5
- Создать карту всех клиентских классов Map
- Предоставьте API для получения getBean(Class class)/GetService(Class classz).
- Проверьте, существует ли несколько реализаций интерфейса или нет никакой реализации
- Классификатор дескриптора для служб или автозапуска по типу в случае нескольких реализаций.
Этот класс в значительной степени использует базовый метод, предоставляемый java.lang. Класс и org.burning wave.classes. Класс Охотник :
Этот класс в значительной степени использует базовый метод, предоставляемый java.lang.reflect. Поле. Метод autowire() в этом классе является рекурсивным методом, поскольку он заботится о внедрении зависимостей, объявленных внутри служебных классов (т.Е. вложенные зависимости):
Основной класс приложения:
Ниже приведено сравнение с зависимостями, добавленными Spring.
Весенние зависимости:
Ваши собственные зависимости от DI framework:
Вывод
Эта статья должна дать четкое представление о том, как работают автоматические зависимости DIor.
При реализации вашего собственного фреймворка DI вам не нужны тяжелые фреймворки, если вы действительно не используете большинство их функций в своем приложении, таких как выполнение методов управления жизненным циклом компонента и многое другое.
Вы можете делать много вещей, которые здесь не упоминаются, например:
- добавление дополнительных пользовательских аннотаций для различных целей (например. как области действия компонента singleton, prototype, request, session, global-session)
- настройка конфигурируемость с помощью заполнителей
- настройка конфигурируемости с помощью Свойства, закодированные в Java
- создание классов во время выполнения
… И многие другие функции.
Отсюда вы можете скачать/клонировать учебное пособие, размещенное на GitHub .
Особая благодарность Шиталу Девалкару за написание статьи и Джиму Джеральду Бертону за сохранение исходного кода этого руководства.
Оригинал: “https://dev.to/bw_software/how-to-create-your-own-dependency-injection-framework-o2l”