Рубрики
Без рубрики

Как создать свой собственный фреймворк внедрения зависимостей в Java

Обзор Эта статья поможет вам понять и создать облегченную Java… Помечено как java, учебное пособие, зависимость, инъекция.

Обзор

Эта статья поможет вам понять и создать легкое 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 для каждой службы в клиентских классах. Шаги:

  1. Просканируйте все клиенты под корневым пакетом и все вложенные пакеты
  2. Создайте экземпляр клиентского класса.
  3. Сканирование всех служб, используемых в клиентском классе (переменные-члены, параметры конструктора, параметры метода)
  4. Проверка всех служб, объявленных внутри самой службы (вложенные зависимости), рекурсивно
  5. Создайте экземпляр для каждой службы, возвращенной на шаге 3 и шаге 4
  6. Автозапуск: Ввод (т.е. инициализация) каждой службы с помощью экземпляра, созданного на шаге 5
  7. Создать карту всех клиентских классов Map
  8. Предоставьте API для получения getBean(Class class)/GetService(Class classz).
  9. Проверьте, существует ли несколько реализаций интерфейса или нет никакой реализации
  10. Классификатор дескриптора для служб или автозапуска по типу в случае нескольких реализаций.

Этот класс в значительной степени использует базовый метод, предоставляемый java.lang. Класс и org.burning wave.classes. Класс Охотник :

Этот класс в значительной степени использует базовый метод, предоставляемый java.lang.reflect. Поле. Метод autowire() в этом классе является рекурсивным методом, поскольку он заботится о внедрении зависимостей, объявленных внутри служебных классов (т.Е. вложенные зависимости):

Основной класс приложения:

Ниже приведено сравнение с зависимостями, добавленными Spring.

Весенние зависимости:
Ваши собственные зависимости от DI framework:

Вывод

Эта статья должна дать четкое представление о том, как работают автоматические зависимости DIor.

При реализации вашего собственного фреймворка DI вам не нужны тяжелые фреймворки, если вы действительно не используете большинство их функций в своем приложении, таких как выполнение методов управления жизненным циклом компонента и многое другое.

Вы можете делать много вещей, которые здесь не упоминаются, например:

… И многие другие функции.

Отсюда вы можете скачать/клонировать учебное пособие, размещенное на GitHub .

Особая благодарность Шиталу Девалкару за написание статьи и Джиму Джеральду Бертону за сохранение исходного кода этого руководства.

Оригинал: “https://dev.to/bw_software/how-to-create-your-own-dependency-injection-framework-o2l”