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

Инъекция Зависимостей с Spring

Общие Сведения В стремлении улучшить обслуживание и обновление проектов, таких принципах… Помеченный как java, весна.

Общие Сведения

В стремлении улучшить обслуживание и обновление проектов, принципы инверсии управления (IOC) являются мощными инструментами. Инъекция зависимостей-это одна из форм реализации IOC. Использование прокладки корень всех зависимостей проекта, эта практика имеет хорошую синергию с другими методиками, которые разделяют те же цели, мы увидим, на практике их использование в простой форме и его применение при использовании Spring.

Инъекция зависимостей и инъекции, медицинские

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

Инъекции зависимостей это pattern design visa вставки внешних зависимостей, чтобы уменьшить захвата приложения, чтобы уменьшить ошибки, переделки и упростить процесс развертывания новых назначений в проект . На первый взгляд может показаться немного запутанным, возможно, хороший пример поможет тебе лучше понять, куда входит, как медицина и долгожданную вакцину от Covid-19 относится к этой теме.

Вакцины работают разными способами, это может быть сделано с вирусом неактивные, ослабленные или синтетически с mRNA. Форму, в которой она работает, не делает большой разницы для нас, в конце концов, наша иммунная система уже точно знаете, что делать при контакте с продуктом вакцины. Точно так же идея инъекций зависимостей! Распределение может быть по-разному, и эти различия не изменится в корне главного нашего проекта.

Руки в тесто

Мы будем применять это теперь, с помощью простой конструкции. Мы изначально два человека, Да с 67 лет, а Марии-80, оба были призваны, чтобы получить доз вакцины от COVID-19, и каждый получил вакцину происхождения различны.

Для представляет их мы будем использовать Класс Лицо, , атрибуты имени и возраста, и их получения задания .

package vacina.di.model; 

public class Pessoa { 
private String nome; 
private int idade; 

public Pessoa(String nome, int idade) { 
    this.nome = nome; 
    this.idade = idade; 
} 

public String getNome() { 
    return nome; 
} 
public int getIdade() { 
    return idade; 
} 
} 

На прививки они оба были в SUS, государственная служба, которая применяет вакцины, мы будем называть эту службу VacinaService , в нем роли, чтобы люди получали вакцину. И ясно, что они были вакцинированы должны присутствовать вакцина , который будет атрибут этого класса. Это представлено через класс VacinaService :

package vacina.di.infrastructure.repository; 
import vacina.di.domain.repository.Vacina; 
import vacina.di.model.Pessoa; 
  
public class VacinaService { 
    private Vacina vacina; 
    public VacinaService(Vacina vacina) { 
        this.vacina = vacina; 
        } 
    public void ReceberVacina(Pessoa pessoa) { 
            vacina.vacinar(pessoa); 
} 
} 

Эта вакцина имеет функции, как применяется, и использовать ее как Интерфейс это важно для низкого захвата. Различные виды вакцин от COVID-19, а позже и в любой другой кампании, могут быть добавлены и изменены реализации интерфейса, это власть инверсии управления . Интерфейс выглядит следующим образом:

package vacina.di.domain.repository; 
import vacina.di.model.Pessoa; 
public interface Vacina { 
  
    void vacinar(Pessoa pessoa); 
} 

Теперь осталось добавлением различных форм вакцины, эти классы будут реализовывать класс Вакцины и проводить override по методу вакцинации , вставив их эксплуатации выдающийся. Здесь у нас есть два примера в классе VacinaPfizer и VacinaAstraZeneca:

package vacina.di.infrastructure.repository.vacinas; 
import vacina.di.domain.repository.Vacina; 
import vacina.di.model.Pessoa; 

public class VacinaPfizer implements Vacina { 
    @Override 
    public void vacinar(Pessoa pessoa) { 

        System.out.printf("%s tem %d anos e recebeu a primeira dose da vacina, aguarde 15 dias para a segunda dose!\n",  
        pessoa.getNome(), 
        pessoa.getIdade()); 

        System.out.println("Seu sistema imunológico recebeu uma versão inativa do vírus"); 
} 
} 
package vacina.di.infrastructure.repository.vacinas; 
import vacina.di.domain.repository.Vacina; 
import vacina.di.model.Pessoa; 
  
public class VacinaAstraZeneca implements Vacina { 

    @Override 
    public void vacinar(Pessoa pessoa) { 
        System.out.printf("%s tem %d anos e recebeu a primeira dose da vacina, aguarde 15 dias para a segunda dose!\n",  
        pessoa.getNome(), 
        pessoa.getIdade()); 
        System.out.println("Seu sistema imunológico recebeu uma versão enfraquecida do vírus"); 
} 

} 

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

package vacina.di; 
import vacina.di.domain.repository.Vacina; 
import vacina.di.infrastructure.repository.vacinas.VacinaAstraZeneca; 
import vacina.di.infrastructure.repository.vacinas.VacinaPfizer; 
import vacina.di.model.Pessoa; 
  
public class Main { 
  
    public static void main(String[] args) { 

        SpringApplication.run(VacinaApiApplication.class, args);
        Vacina vacina1 = new VacinaAstraZeneca();
        VacinaService vacinaService1 = new VacinaService(vacina1);
        Pessoa p1 = new Pessoa ("Antônio", 67);
        vacinaService1.ReceberVacina(p1);

        System.out.println("-----");

        Vacina vacina2 = new VacinaPfizer();
        VacinaService vacinaService2 = new VacinaService(vacina2);
        Pessoa p2 = new Pessoa ("Maria", 80);
        vacinaService2.ReceberVacina(p2);
} 

И, наконец, выход будет.

Antônio tem 67 anos e recebeu a primeira dose da vacina, aguarde 15 dias para a segunda dose! 
Seu sistema imunológico recebeu uma versão enfraquecida do vírus 
----- 
Maria tem 80 anos e recebeu a primeira dose da vacina, aguarde 15 dias para a segunda dose! 
Seu sistema imunológico recebeu uma versão inativa do vírus 

Spring Boot, IOC Container и их компетенции

Чтобы обеспечить непрерывность в проект, прежде всего, нам необходимо знать Пружинный контейнер IOC . Он отвечает за управляемыми объектами, Spring называют Beans . Является одним из сильные Spring , видно, что он создает, управляет путем использования и делает инъекции зависимостей объектов автоматическим способом . Давайте посмотрим, как это делается на практике.

С помощью управления Spring

Весна-это средство, очень умный, но она по-прежнему нуждается в нас, чтобы indicarmos для ее управления. И это делается таким образом, а также практики, аннотации, посмотрите только:

С помощью аннотации @Component это форма indicarmos, что наш класс это Бин . Вы уже должны знать, что перед тем, как использовать объект, вам нужно ссылается на вас в памяти. В примере у нас есть класс VacinaService в качестве параметра Вакцину, которая будет реализован Интерфейс Вакцины. Spring определяет зависимость инъекций и уже входит в автоматическом режиме выполнения .

Теперь с помощью приложения Spring, класс main изменяется, чтобы инициализировать приложение Spring с использованием SpringApplication.run , этот вопрос запуска должен рассматриваться в следующей статье на глубину, соответствующую . Для определения класса необходимо заметки @SpringBootApplication .

Один хороший способ защититься ошибок является использование аннотации @ComponentScan с именем autoexplicativo, несет ответственность за сканировать приложения на наличие Beans для управления, для этого необходимо сообщить package базы, где находится приложение. Таким образом, класс Application, основное, это будет выглядеть как то так:

package com.gomes.daniel.vacina;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.ComponentScan;

@SpringBootApplication
@ComponentScan(basePackages = "com.gomes.daniel")
public class VacinaApi2Application {

    public static void main(String[] args) {
        SpringApplication.run(VacinaApiApplication.class, args);
    }

}

Точки Впрыска

Во-первых, точки инъекции являются места в приложении, где Spring ставит зависимостей Bean, , например, экземпляров на строительство объекта. Если мы с помощью полиморфизма, и объект имеет более одного конструктора, причем ни один из них не конструктор без параметров, таких как Spring знает, какой он должен использовать?

В этом случае, что входит более заметку @Autowired , она указывает Spring, где сделать инъекции в Бин. Представьте, что наш класс VacinaService имеет более одного конструктора, без аннотации, Spring будет отображать сообщение об ошибке выполнения при выполнении кода ниже:

package com.gomes.daniel.di.infrastructure.repository;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import com.gomes.daniel.di.domain.repository.Vacina;
import com.gomes.daniel.di.model.Pessoa;

@Component
public class VacinaService {

    private Vacina vacina;

    @Autowired
    public VacinaService(Vacina vacina) {
        this.vacina = vacina;
        System.out.println("Teste VacinaService");
    }

    public VacinaService(int quantidade) {
        //Alguma inicialização
    }

    public VacinaService(String[] locais) {
        //Alguma inicialização
    }


    public void ReceberVacina(Pessoa pessoa) {
        vacina.vacinar(pessoa);
    }
}


Неоднозначность Beans

Неоднозначность Бин-это что-то очень часто в приложениях, поскольку являются последствием инверсии управления , как Spring делает инъекции в автоматическом режиме, необходимо что ему нужно о том, какая Фасоль использовать в случаях неоднозначности. Эта проблема возникает в таких случаях, как проекта Вакцины, где наша VacinaService получить объект Вакцину, и у нас есть VacinaPfizer и VacinaAstraZeneca , что происходит? Это же ошибка при запуске. Здесь и вступает в нашей прошлой заметке основные статьи @Primary , ответственность за указания Spring которой Bean ответственности, как инъекции. Необходимо отметить, что существуют методы, лучшие практики, что это, но это стоит статья родном и подробно, в этом случае упрощенный имеем то, как будет выглядеть класс VacinaAstraZeneca как первичный.

package com.gomes.daniel.di.infrastructure.repository.vacinas;

import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;
import com.gomes.daniel.di.domain.repository.Vacina;
import com.gomes.daniel.di.model.Pessoa;

@Primary
@Component
public class VacinaAstraZeneca implements Vacina {


    public void vacinar(Pessoa pessoa) {
        System.out.printf("%s tem %d anos e recebeu a primeira dose da vacina, aguarde 15 dias para a segunda dose!\n", 
                    pessoa.getNome(),
                    pessoa.getIdade());
        System.out.println("Seu sistema imunologico recebeu uma versao enfraquecida do virus");
    }

}

Эсперо, что такое гия рапидо, тенха, те, кто судит, а не умы, которые воспринимают да используют, о предметной эпохе, разработанной в гии, простые вещи, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, часть, особенный весенний ОТДЫХ да водоросли. Спасибо за чтение. Daniel Gomes

Оригинал: “https://dev.to/danieldjgomes/injecao-de-dependencias-com-spring-ib”