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

Как работает знаменитый инъекции зависимостей, и почему это важно

Один интересный момент, о мире Java это огромный объем работ, в строительстве… С тегами бразильские разработчики, новички, java, учебник.

Один интересный момент, о мире Java это огромное количество мероприятий, в создании альтернативы для J2EE .

Многое из этого исходит из сложности вселенной, J2EE, но кроме того, изучение альтернатив, откуда все творческие идеи.

Общей проблемой в борьбе с различными элементами, например: “Как подключить архитектуры веб-интерфейс баз dedados, когда они построены в разные времена и знания, различающиеся?”

Это было такого рода проблем, что появились многочисленные механизмы с целью соединения компонентов J2EE различных слоев. В случае Java, наиболее известен Spring .

В том числе, до весны уже несколько “вариантов” скажем так, рассказывает интересно, много работать хорошо с этой componentização. Рамки, которые основывались/предлагают, которые будут лучше, чем Весна, например, являются: Micronaut и Quarkus .

Под эти рамки, у нас есть ряд интересных design principles, что выходит за рамки, контейнеры J2EE. Давайте рассмотрим некоторые из этих принципов!

Компоненты и Услуги

Для целей стандартизации терминов, здесь будет использоваться компоненты в том смысле, файлы .JAR библиотеки dll или даже импорт из библиотеки.

И услуги в направлении: веб-сервис, мессенджер, RPC или даже сокета.

Простой пример

Мы будем использовать пример компонента, список фильмов режиссер.

class ConsultorDeFilmes {

    public Filme[] filmeDirigidoBy(String diretor) {
        List todosFilmes = finder.findAll();
        for (Iterator it = todosFilmes.iterator(); it.hasNext(); ) {
            Filme filme = (Filme) it.next();
            if (!filme.getDiretor().equals(diretor)) it.remove();
        }
        return (Filme[]) todosFilmes.toArray(new Filme[todosFilmes.size()]);
    }
}

Реализация этой функции является совершенно простым, – это запрос, чтобы найти объект, вернуться, все фильмы из списка. После того, как это предлагается, что он возвращает только те фильмы, под руководством директора, что мы хотим.

Момент, который мы собираемся сосредоточиться в этом развертывания в finder.findAll();

более конкретно на то, как мы связываем объект, на который предлагается (директор) с объекта finder в частности. Причина того, чтобы быть интересным является то, что я хочу, чтобы метод filmeDirigidoBy совершенно независимо, как и все хранятся.

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

public interface ProcuraFilmes{
    List findAll();
}

С этим, мы desacoplamos в findAll (), но все-таки мы должны будем сделать его в конкретный класс, в какой-то момент, чтобы вернуться фильмов, которые мы хотим. Давайте сделаем так, что код доступа конструктор ConsultorDeFilmes:

class ConsultorDeFilmes {

        private ProcuraFilmes finder;
        public ConsultorDeFilmes(){
            finder = new ColunaDelimitadaProcuraFilmes("filmes1.txt");  
    }

}

Имя класса реализации, видя то, мы с помощью файла .txt с разделителями столбцов.

Теперь, если я использую этот класс только в этой реализации, в порядке, но что происходит, если кто-то хочет копию этого же приложения? 🤔

Просто, если человек хранить фильмы в файл .txt с разделителями столбцов с именем “filmes1.txt”, приложение будет работать спокойно. Если вы используете другое имя файла, например, ей просто нужно изменить имя класса развертывания, пока здесь, ладно.

Но и если ее использовать совершенно разные хранить фильмы, например, в базе данных SQL, файл XML, веб-службы, среди других? 🤔 🤔

В этом случае понадобится другой класс для развертывания и извлечения данных. И вот, что я скажу: Потому что мы ставим ProcuraFilme в качестве интерфейса, это не изменить метод filmesDirigidoBy , но все же нужен способ создания экземпляров finder правильной формы реализации.

MovieLister//Поиск фильмов//moviefinderимплицирует конкретный интерфейс da. Фонте: https://martinfowler.com/articles/injection/naive.gif

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

Но как это сделать? Среднее среднее среднее

Класс реализации не linkada в приложение во время компиляции и не saebemos, как этот человек сделает реализацию интерфейса. То есть, мы рискуем получить код изменен (реализация интерфейса, который указан в ConsultorDeFilmes) и, следовательно, приложение будет ломаться.

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

Мы chamos этой ситуации “модуль”, в реальной ситуации мы, возможно, тысячи услуг и детали, которые мы должны выполнять различными способами. Плагин взаимодействует с этими службами и компонентов с помощью интерфейсов, и, поэтому, они решили реализации без изменения нашего приложения.

Возвращаясь наш предыдущий вопрос: Но как это сделать? Среднее среднее среднее

Ответ: Инверсия Управления

Инверсия управления

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

Что важно, даже это: “Какой аспект управления этих рамок, обращают?”

Инверсия управления-это то, что отличает framework библиотеки. Библиотека-это только набор функций, которые вы используете, уже framework представляет собой абстрактный дизайн с поведением. В framework, вы должны поместить поведение в различных местах на подклассы или подключение в свои собственные классы f(о весенних фазах использования бобов EAnnotations, por exemplo).

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

Думая об этом, Инверсии Управления (Заворот of Control, IoC) – это термин очень общий и, по мнению некоторых экспертов, термин, в данном случае, будет Инъекций ((Внедрение зависимостей).

Формы Инъекций

Идея внедрения зависимостей, чтобы “ассемблер” или ассемблер, что poupla поле в классе ConsultorDeFilmes с соответствующей реализации интерфейса ProcuraFilmes, получаю следующим образом:

MovieLister//Поиск фильмов//moviefinderимплицирует конкретный интерфейс da. Ассемблер Фонте: https://martinfowler.com/articles/injection/injector.gif

На вершине этой схемы, у нас есть 3 основных способа сделать инъекции зависимостей:

  • “Инверсия Управления” (тип 01 – Инъекций интерфейс (Injection Интерфейс)
  • Инверсия Управления типа 02 – Инъекции по сеттер(Сеттер Интерфейс)
  • Инверсия Управления типа 03 – Инъекции по наряду(Constructor Интерфейс)

В нашем случае, мы будем говорить о Spring.

Эта framework включает в себя слои абстракции для транзакций, в рамках сохранение в базе данных, веб-приложения и JDBC. Он поддерживает как инъекцию в конструктор, как сеттер, но разработчики его предпочитают инъекции по сеттер, давайте посмотрим, как это выглядит в этом случае.

Наша ConsultorDeFilmes примите инъекции, мы должны определить метод set для службы.

class ConsultorDeFilmes {

    private ProcuraFilmes finder;
    public void setFinder(ProcuraFilmes finder){
        this.finder = finder;
    }

}

Также мы будем определять сеттер, чтобы имя файла:

class ArquivoConsultorDeFilmes {

    public void setNomeArquivo(String nomeArquivo){
        this.nomeArquivo = nomeArquivo;
    }

}

Последний шаг-это настройка, Spring поддерживает конфигурации в файлы XML и в коде тоже, но с XML является наиболее подходящим.


    
        
            
        
    
    
        
            filmes1.txt
        
    

Пример проверки:

public void testComSpring() throws Exception {
    ApplicationContext ctx = new

FileSystemXmlApplicationContext("spring.xml");
    ConsultorDeFilmes consultor = (ConsultorDeFilmes)

ctx.getBean("ConsultorDeFilmes");
    Filmes[] filmes = consultor.filmesDirigidosBy("James Cameron");

    assertEquals("Titanic", movies[0].getTitle());
}

Закончить…

Во-первых я бы хотел поблагодарить своего любопытства и терпения прочитать до сюда, значительная часть текста был мой перевод текста на Мартин Фаулер (martin fowler , я старался максимально быть верным до объяснения его, некоторые моменты, которые я нашел очень сложный, я попытался упростить объяснение знает он, что более ясным для меня, и для тебя 😉 и я также добавил немного с моей точки зрения.

Хочу отметить здесь также, в случае пользователя в Spring и его знаменитые аннотации: аннотации являются не более чем интерфейсы, вскоре, они следуют тому же принципу инверсии управления, упомянутых в тексте. Напомним, что мы создаем bean в Spring у нас есть @Bean, здесь завершение становится легко, правда?

Фонтес: https://martinfowler.com/articles/injection.html

Фонтес:|| https://martinfowler.com/articles/injection.html

Оригинал: “https://dev.to/diariodeumacdf/como-funciona-a-famosa-injecao-de-dependencia-e-porque-ela-e-importante-3dii”