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

Активный Укол. Быстрая и легкая библиотека внедрения зависимостей

Что такое Активная инъекция? Активная инъекция – это молниеносная и мощная инъекция зависимостей l… С тегами java, новости, внедрение зависимостей, фреймворк.

Что такое Активная инъекция?

Active Inject – это молниеносная и мощная библиотека инъекций зависимостей. Он предлагает множество инструментов и функций: поддержку вложенных областей, одиночных и переходных привязок, модулей, многопоточных и однопоточных инжекторов.

В то же время он тщательно оптимизирован со всей предварительной обработкой графика зависимостей, выполняемой во время запуска. Согласно контрольным показателям, в некоторых сценариях Активный впрыск в 5,5 раза быстрее, чем Сок, и в сотни раз быстрее, чем весенний DI. Вы можете проверить источники тестов здесь .

Активная инъекция является независимой технологией Активный платформа. Он не имеет собственных зависимостей от сторонних производителей и может использоваться в качестве автономной библиотеки DI.

Приступая к работе

Давайте попробуем библиотеку и испечем несколько виртуальных файлов cookie с помощью Active Inject . Для печенья требуются следующие ингредиенты: Мука , Сахар и Сливочное масло . Эти ингредиенты образуют Выпечка которую можно запечь в Печенье . Предположим, что у каждой из этих сущностей есть POJO. Давайте начнем с простого примера:

public void provideAnnotation() {
  Module cookbook = new AbstractModule() {
     @Provides
     Sugar sugar() { return new Sugar("WhiteSugar", 10.f); }

     @Provides
     Butter butter() { return new Butter("PerfectButter", 20.0f); }

     @Provides
     Flour flour() { return new Flour("GoodFlour", 100.0f); }

     @Provides
     Pastry pastry(Sugar sugar, Butter butter, Flour flour) {
        return new Pastry(sugar, butter, flour);
     }

     @Provides
     Cookie cookie(Pastry pastry) {
        return new Cookie(pastry);
     }
  };

  Injector injector = Injector.of(cookbook);
  injector.getInstance(Cookie.class).getPastry().getButter().getName());
}

Здесь мы создали Абстрактный модуль с именем кулинарная книга , которая содержит все необходимые привязки или “рецепты” для ингредиентов. Вызов Injector.getInstance метод получения экземпляра файла Cookie .

Как это работает изнутри? Инжектор предоставляет все необходимые зависимости для компонента, рекурсивно пересекающего график зависимостей по порядку. Поэтому он сначала создал Сахар , Сливочное масло и Мука , следующая была Выпечка и, наконец, Печенье .

Именованные привязки

Но что, если вам нужны какие-то особые рецепты печенья для разных людей? Например, если вам нужно печенье без сахара Печенье в дополнение к обычному. В этом случае вы можете использовать @Named аннотацию:

public void namedAnnotationSnippet() {
  Module cookbook = new AbstractModule() {
     @Provides
     @Named("zerosugar")
     Sugar sugar() { return new Sugar("SugarFree", 0.f); }

     @Provides
     @Named("normal")
     Sugar sugar2() { return new Sugar("WhiteSugar", 10.f); }

     @Provides
     Butter butter() { return new Butter("PerfectButter", 20.f); }

     @Provides
     Flour flour() { return new Flour("GoodFlour", 100.f); }

     @Provides
     @Named("normal")
     Pastry pastry1(@Named("normal") Sugar sugar, Butter butter, Flour flour) {
        return new Pastry(sugar, butter, flour);
     }

     @Provides
     @Named("zerosugar")
     Pastry pastry2(@Named("zerosugar") Sugar sugar, Butter butter, Flour flour) {
        return new Pastry(sugar, butter, flour);
     }

     @Provides
     @Named("normal")
     Cookie cookie1(@Named("normal") Pastry pastry) {
        return new Cookie(pastry);
     }

     @Provides
     @Named("zerosugar")
     Cookie cookie2(@Named("zerosugar") Pastry pastry) { return new Cookie(pastry); }
  };
}

Использование аннотации @Named является довольно наглядным. После аннотирования привязок вы можете вызвать либо injector.getInstance(Ключ.имя_имя(Cookie.class, "нормальный")) |/или инжектор.getInstance(Ключ.имя(Cookie.class, "нулевой сахар")) и получите разные экземпляры класса Cookie .

Не Одноэлементные экземпляры

Один из важных Активная функция внедрения заключается в том, что все созданные экземпляры по умолчанию являются одноэлементными . Если вы вызовете инжектор.getInstance(Cookie.class ) несколько раз, каждый раз вы будете получать один и тот же экземпляр из кэша. Вы можете легко проверить это с помощью следующего кода:

AbstractModule cookbook = new AbstractModule() {
    @Provides
    Integer giveMe() {
        return random.nextInt(1000);
    }
};
Injector injector = Injector.of(cookbook);
Integer firstInt = injector.getInstance(Integer.class);
Integer secondInt = injector.getInstance(Integer.class);
System.out.println("First : " + firstInt + ", second  : " + secondInt);

Это полезная оптимизация, но что, если нам понадобятся не одноэлементные файлы cookie? В этом случае вы можете использовать области видимости.

Область создает “локальные синглеты”, которые живут столько же, сколько и сама область. Области действия Active Inject немного отличаются от других библиотек DI. Внутренняя структура Инжектора представляет собой префиксное дерево а префикс – это область действия. Если вы создадите Инжектор , который настроен на определенную область, это означает, что Инжектор входит в эту область. Это можно сделать несколько раз, чтобы в одном объеме было несколько инжекторов.

Давайте создадим область для наших файлов cookie. Идентификаторами дерева являются аннотации. Таким образом, вы можете просто создать свои собственные аннотации области:

@ScopeAnnotation(threadsafe = false)
@Target({ElementType.METHOD})
@Retention(RUNTIME)
public @interface OrderScope {
}

Затем создайте экземпляр своей области:

public static final Scope ORDER_SCOPE = Scope.of(OrderScope.class);

Добавьте @Orderscope аннотации к экземплярам, которые необходимы как не-синглеты ( Cookie , Кондитерские изделия , Сахар , Мука , Сливочное масло ) следующим образом:

Module cookbook = new AbstractModule() {
  @Provides
 @OrderScope
  Sugar sugar() { return new Sugar("WhiteSugar", 10.f); }

…

  @Provides
  Kitchen kitchen() {return new Kitchen();}
};

Теперь каждый раз, когда нам нужен новый экземпляр Cookie , наш Инжектор создаст дополнительный инжектор для входа в область заказа и создаст новый экземпляр Cookie , в то время как Кухня всегда будет оставаться одноэлементной в корневой области.

Использование активной инъекции с Активным специализированным

Еще одна интересная функция Active Inject заключается в том, что она полностью совместима с другой Активная библиотека с именем Активная специализированная .

Active Specialized – это уникальная технология, основанная на новаторской концепции использования информации о времени выполнения экземпляров классов. Активный специализированный перезаписывает ваш код непосредственно во время выполнения, используя информацию о времени выполнения, которая содержится в экземплярах ваших классов. Если быть более точным, он преобразует все поля класса в статические поля класса, де-виртуализирует все вызовы виртуальных методов и заменяет их вызовами статических методов. Active Specialized лучше всего проявляет себя в структурах, подобных ACT, поэтому он очень эффективен с Active Inject . Согласно тестам, Active Specialized

Чтобы подать заявку Активный специализированный на ваш Инжектор просто позвоните Инжектор. используйте специализированный метод перед Инжектором созданием экземпляра.

Резюме

Active Inject выходит далеко за рамки этих базовых примеров и способен к точной настройке в соответствии со всеми вашими потребностями. Вы можете найти больше примеров на официальном сайте Активный впрыск веб-сайт .

Так как Активная инъекция является частью Активный , он идеально совместим со всеми компонентами платформы: HTTP-серверами и сервлетами, реализацией RPC, инструментами обработки байт-кода, абстракциями для эффективного управления распределенным хранилищем файлов и другими.

Оригинал: “https://dev.to/activej/activeinject-fast-and-lightweight-dependency-injection-library-388f”