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

Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice

Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования зависимостей… Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости…

Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости… Внедрение зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования внедрения зависимостей в Java. Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости… Внедрение зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования зависимостей Для подробной документации и справочного контекста библиотеки Guice см. официальная документация Guice . инъекция ency в Java.

Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости… Внедрение зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования зависимостей Для подробной документации и справочного контекста о том, что такое библиотека Guice, см. || официальная документация Guice || . инъекция ency в Java.

Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости… Внедрение зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования зависимостей Для подробной документации, а фоновый контекст вокруг внедрения зависимостей (DI) является шаблоном проектирования. Что такое библиотека Guice, смотрите в || официальной документации Guice || . инъекция ency в Java. Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости… Внедрение зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования зависимостей Для подробной документации, а фоновый контекст вокруг внедрения зависимостей (DI) является шаблоном проектирования. В чем разница? Его основной принцип заключается в том, чтобы отделять поведение от разрешения зависимостей. Библиотеку Guice смотрите в || официальной документации Guice || . инъекция ency в Java. Используйте @swc-узел/шутку https://github.com/Brooooooklyn/swc-node Используйте babel только для внедрения зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным тегам java, designpatterns, guice. методы использования зависимости… Внедрение зависимостей в Java с помощью Guice Этот пост разработан как обзор и справочное руководство по различным методам использования зависимостей Для подробной документации, а фоновый контекст вокруг внедрения зависимостей (DI) является шаблоном проектирования. Что такое ДИ? d Его основной принцип заключается в том, чтобы отделять поведение от зависимостей – это означает, что ваши классы должны иметь дело только со своей функцией и не должны учитывать, откуда берутся их зависимости. разрешение сай. Библиотеку Guice смотрите в || официальной документации Guice || . инъекция ency в Java.

Зачем использовать DI?

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

Во-вторых, внедренные зависимости легко имитировать, что облегчает тестирование ваших слабо связанных классов. Как вы увидите позже, издеваться над тем, что когда-то было сложными зависимостями, так же просто, как использовать аннотацию @Mock и передавать их конструктору.

Все примеры приведены для справки

Как говорится в заголовке, все примеры в этом посте используют Guice для разрешения зависимостей. Guice – это стандартная библиотека Java для реализации DI, широко используемая и хорошо документированная в Интернете. Давайте сразу перейдем к делу.

Настройка приложения

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

public MyModule extends AbstractModule {
    @override
    protected void configure() {
        // Write your bindings for interfaces here e.g.
        bind(IMyInterface.class).to(MyInterfaceImpl.class);
    }
}
public static void main(String[] args) {
    Injector injector = Guice.createInjector(new MyModule());
    // Injected instance of MyClass.
    MyClass myClass = injector.getInstance(MyClass.class);
}

Внедрение зависимостей с помощью аргументов конструктора (Рекомендуемый подход)

Это простейший пример внедрения зависимостей. |/Мой введенный класс имеет конструктор без аргументов, поэтому его можно ввести в Мой класс без какой-либо настройки. Guice создаст новый экземпляр MyInjectedClass - нет необходимости в фабричном классе или новом MyInjectectedClass(); . @Inject

public MyInjectedClass () {
    ...
} 

@Inject
public MyClass(MyInjectedClass injectedClass) {
    ...
} 

Если ваш внедренный класс имеет зависимости, аннотируйте этот класс аннотацией @Injection . Guice будет рекурсивно извлекать необходимые экземпляры до тех пор, пока не достигнет конструктора без аргументов или все зависимости не будут удовлетворены.

Ввод Зависимостей От Полей.

Вместо использования аргументов конструктора зависимости можно вводить непосредственно в поле. Это наиболее лаконичная форма инъекции, но ее трудно протестировать (ниже описывается внедрение конструктора тестирования).

public class DemoClass {
    @Inject
    MyClass instanceOfMyClass;

    public DemoClass() {
        // NOTE THAT instanceOfMyClass will be null here
    }

    public bool hasMyClass() {
        return instanceOfMyClass != null;
    }
}

Одна вещь, которую следует отметить в отношении ввода поля, заключается в том, что поле не будет создано внутри конструктора . Если вам нужно создать экземпляр поля в конструкторе, вы должны использовать инъекцию конструктора.

DI для статических зависимостей

Вы можете обнаружить, что переносите части старого проекта со статических фабрик на внедрение зависимостей, и вам нужно захватить экземпляр класса, настроенного для DI в статическом классе. Без проблем. Вы можете настроить Guice для настройки статических классов во время создания инжектора.

// Override the configure() method of your module
@Override 
public void configure() {
    requestStaticInjection(MyStaticClass.class);
}
...

class MyStaticClass {
    @Inject
    private static MyClass instanceOfMyClass;
}

Использование аннотации “Предоставляет”

Если вашему классу требуется некоторая настройка, вы можете создать аннотированный метод @Provides внутри вашего модуля. Это позволяет вам запускать некоторый код или предоставлять некоторую конфигурацию при создании экземпляра класса.

@Provides
public MyClass providesMyClass() {
    MyClass instance = new MyClass();
    instance.setSomeValue("cool");
    return instance;
}

Именованная аннотация

Аннотация @Named позволяет идентифицировать конкретный экземпляр класса. Это требуется Guice, если у вас более одного экземпляра класса – очень удобно, если вы подключаетесь к нескольким базам данных или кэшам, используя один и тот же класс-оболочку, просто настройте @Named поставщик для каждого из них.

@Provides
@Named("SpecialInstanceOfMyClass")
public MyClass providesMyClass() {
    return new MyClass();
}

@Inject
public SomeOtherClass(@Named("SpecialInstanceOfMyClass") MyClass instanceOfMyClass) {
    ...
}

Привязка интерфейсов к реализациям

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

public MyModule extends AbstractModule {
    @override
    protected void configure() {
        // Write your bindings for interfaces here e.g.
        bind(IMyInterface.class).to(MyInterfaceImpl.class);
        bind(IOtherInterface.class).to(OtherImplementation.class);
    }
}

Настройка нескольких модулей

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

Injector injector = Guice.createInjector(
    new MyModule(),
    new OtherModule()
);

Автоматически связанные вещи

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

Тестирование

Самое замечательное в внедрении зависимостей заключается в том, что оно облегчает моделирование ваших зависимостей и упрощает написание тестов. Представьте себе следующий класс с двумя зависимостями, введенными в конструктор:

class MyExampleClass {
    DBClient client;
    CacheClient cache;

    @Inject
    public MyExampleClass(DBClient client, CacheClient cache) {
        this.client = client;
        this.cache = cache;
    }
}

Используя аннотацию @Mock , мы можем заставить Mockito создать макет версии каждой из зависимостей без дополнительной настройки. Они могут быть переданы в наш конструктор для последующего использования. Пример тестового файла может выглядеть следующим образом:

@RunWith(MockitoJUnitRunner.class)
public class MyExampleClassTest {
    @Mock
    DBClient mockClient;
    @Mock
    CacheClient mockCache;

    MyExampleClass myClass;

    @BeforeEach
    public void setup() {
        myClass = new MyClass(mockClient, mockCache);
    }

    @Test
    public void myTest() {
        // Use the static Mockito.when() method to set up your mocks
        when(mockClient.connect()).thenReturn(new Connection());
        myClass.someFunction();
    }
}

Создание инжектора и классов привязки

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

@RunWith(MockitoJUnitRunner.class)
public class MyExampleClassTest {
    @Mock
    MyFieldDependency mockDependency;

    @BeforeEach
    public void setup() {
        var injector = Guice.createInjector(new AbstractModule() {
            @Override
            protected void configure() {
                bind(MyFieldDependency.class).toInstance(mockDependency);
            }
        });
        myClass = injector.getInstance(MyClass.class);
    }

    @Test
    public void myTest() {
        // Use the static Mockito.when() method to set up your mocks
        when(mockDependency.something()).thenReturn(true);
        myClass.someFunction();
    }
}

Это говорит Guice о том, чтобы извлечь экземпляр MyClass и использовать макет зависимости для разрешения введенного поля MyFieldDependancy .

Оригинал: “https://dev.to/tbutterwith/dependency-injection-in-java-with-guice-51pk”