Перейти к основному содержанию

Binding transformations

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

Пример запуска#

Сначала мы создадим новый Launcher, расширив файл Launcher класс.

public class BindingTransformationExample extends Launcher {    ...}

Затем определим интерфейс Person с единственным методом void greet().

public interface Person {  void greet();}

И введите экземпляр класса Person в программу запуска приложения, добавив поле person , аннотированное аннотацией @Inject .

@InjectPerson person;

Наша программа запуска приложения переопределяет метод Launcher#run только для того, чтобы вызвать метод person.greet() .

@Overrideprotected void run() {  person.greet();}

Модуль "Человек#

Программа запуска приложения использует 2 модуля для введения зависимости Person person .

@Overrideprotected Module getModule() {  return Modules.combine(      new PersonModule(),      new PersonTransformModule()  );}

Первый (PersonModule) - это простой AbstractModule , который обеспечивает единственную зависимость для класса Person .

public static class PersonModule extends AbstractModule {  @Provides  Person greeter() {    return () -> System.out.println("Hello!");  }}

Предоставленный Person просто печатает "Hello!" , когда вызывается метод greet() .

Модуль трансформации личности#

Модуль PersonTransformModule - это модуль, который будет перехватывать предоставленный класс Person и добавлять логирование в вызовы метода greet() .

public static class PersonTransformModule extends AbstractModule {  @Override  protected void configure() {    transform(Person.class, (bindings, scope, key, binding) ->        binding.mapInstance(person ->            () -> {              System.out.println("Start of greeting");              person.greet();              System.out.println("End of greeting");            }        ));  }}

Модуль не экспортирует никаких зависимостей, используя аннотацию @Provides . Вместо этого он переопределяет метод AbstractModule#configure только для того, чтобы вызвать метод transform(...) . Рассмотрим подробнее вызов transform(...) . Принимает 2 аргумента: Класс - класс привязки, которая будет преобразована (это может быть изменено на KeyPattern для преобразования всех привязок, соответствующих шаблону ключа. BindingTransformer<T> - трансформатор, который сам по себе является функциональным интерфейсом, принимающим привязки, область видимости, текущий ключ и привязку и возвращающим новую привязку (или ту же самую привязку, если трансформации не произошло). Мы вызываем метод Binding#mapInstance на полученной привязке и указываем, как должен быть преобразован экземпляр Person . Здесь мы возвращаем новый экземпляр класса Person , который добавляет некоторые System.out логи до и после вызова person.greet() на исходном экземпляре person.

Запуск примера#

Для запуска примера нам нужно определить метод main , который просто создаст новый экземпляр нашей программы запуска приложений и передаст аргументы приложения методу Launcher#launch .

public static void main(String[] args) throws Exception {  BindingTransformationExample launcher = new BindingTransformationExample();  launcher.launch(args);}

При запуске приложения оно должно вывести на stdout:

Начало приветствияЗдравствуйте!Конец приветствия

Примеры источников можно найти на Github