Привет,

Сегодня я собираюсь поговорить о том, как начать работу с Google Guice для внедрения зависимостей в Java. Сначала я расскажу о некоторых концепциях фреймворка, а затем мы напишем простое приложение для демонстрации.

Внедрение зависимости

Как мы уже говорили в этом посте, внедрение зависимостей (DI) - это метод предоставления зависимостей для клиентов вместо того, чтобы последний явно их получал. DI - это, по сути, способ достижения более общей цели, называемой принципом инверсии зависимостей (DIP), который гласит:

Вместо того, чтобы зависеть от реализаций, предпочитайте полагаться на абстракции.

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

Что касается Java, существует множество фреймворков с возможными плюсами и минусами, например, Weld, Spring, Guice и т. Д.

В этом посте мы будем использовать Guice, а в следующем посте я намерен поговорить о Spring, вероятно, в контексте разработки RESTful API с помощью Spring Boot и Spring REST.

Google Guice

Google Guice - это платформа для автоматизации внедрения зависимостей, предоставляющая контейнер, в котором мы можем отображать абстракции и реализации. После сопоставления зависимости будут автоматически внедрены в клиентов по запросу.

Сопоставление в Guice достигается реализацией com.google.inject.Module, которая обычно выполняется путем наследования от абстрактного базового класса com.google.inject.AbstractModule.

После этого нам нужно переопределить метод configure и полагаться на свободный API, вызвав методы bind и to для определения сопоставления между абстракцией ( параметр привязки) и реализации (параметр to).

Затем мы можем внедрить зависимости, аннотируя ваши зависимости с помощью com.google.inject.Inject.

Наконец, нам нужно получить com.google.inject.Injector из нашего ранее определенного модуля, поэтому теперь мы можем получить клиента с помощью метода getInstance и его зависимостей. будет автоматически введен.

Пример

Этот пример состоит из части системы Java, которая отправляет в журнал информацию о своей работе. Чтобы упростить включение Guice в наш проект, мы собираемся использовать Maven в качестве инструмента сборки.

В pom.xml добавьте следующий артефакт для Guice версии 4.0 в раздел зависимостей:

‹Dependency›
‹groupId› com.google.inject ‹/groupId›
‹artifactId› guice ‹/artifactId›
‹version› 4.0 ‹/version›
‹/ dependency ›

Давайте создадим интерфейс LogSender для представления поведения: «отправляет журнал на какой-то носитель»:

Эта служба будет использоваться классом Exchanger, имеющим ссылку на LogSender, и внедрение будет выполнено его конструктором, помеченным @Inject:

Реализация StdoutLogSender отправит журнал в стандартный поток вывода, в данном случае в консоль:

Теперь нам нужно сообщить Guice, как сопоставить LogSender и StdoutLogSender, и мы делаем это с помощью класса LoggingModule:

Наконец, в основном классе Application мы можем создать Injector и передать наш LoggingModule его конструктору. Затем мы можем получить экземпляр Exchanger, который будет зависеть от привязанного LogSender:

Вывод

В этой статье мы обсудили основы того, как начать работу с Google Guice для автоматизации задач внедрения зависимостей в Java-приложении. Мы написали простое приложение, чтобы проиллюстрировать, как определить соответствие между абстракциями и реализациями и как внедрить их в наших клиентов.

Я надеюсь, что с помощью этого базового обзора Guice вы сможете продолжить изучение внедрения зависимостей и разработки кода с более низким уровнем связи и высоким уровнем согласованности.

использованная литература

[1] https://medium.com/@varago.rafael/managing-coupling-with-dependency-injection-46157eb1dc4d

[2] https://www.martinfowler.com/articles/injection.html

[3] https://github.com/google/guice