[CONTEÚDO] Inversão de Controle E Injeção de Dependência 💉

A inversão de controle IoC é a mudança de conhecimento que uma classe tem em relação a outra

Analogia do carro

  • No carro, o motor depende da bateria
  • Porém, a base de encaixe da bateria é fora do motor

"Por que não colocar a base de encaixe dentro do motor?"

Porque caso seja necessário trocar a bateria, não é preciso abrir o motor.

Isso quer dizer que o motor não tem nada haver com a bateria, ele se quer sabe que ela existe.

Contextualizando

  • Se um componente A depende de B, A NÃO deve ter controle sobre essa dependência. Ou seja, se for preciso mudar o B não será preciso mudar o A.
  • É preciso trocar o controle. Ou seja, o controle da dependência deve ficar fora do A

Controle Errado

Se um componente A depende de B, a NÃO deve ter de quem será essa dependência.

public class SalaryService {
	private TaxService taxService = new TaxService(); 
	

É errado colocar o new TaxServicedentro do SalaryService, pois se for necessário trocar o new é preciso abrir o SalaryService.

O TaxService é a bateria e o SalaryService é o carro.

Controle Certo

public class SalaryService {
	private TaxService taxService; 
	

Injeção de Dependência - DI

Uma vez que o sistema usa o principio da inversão de controle, quando um componente A depende do componente B , essa dependência precisa ser injetada.

Injeção por Construtor

Esse tipo de injeção de dependência é comumente usado, basicamente vamos receber no construtor a instancia da classe que queremos injetar.

public class SalaryService {

	private TaxService taxService;

	public SalaryService(TaxService taxService) {
		this.taxService = taxService;
	}
}

Bem melhor, não é?

Injeção por Método Set

Basicamente vamos criar um método set que irá receber a instancia da classe que queremos injetar.

public class SalaryService {

	private TaxService taxService;

	public setTaxService(TaxService taxService) {
		this.taxService = taxService;
	}
}

Injeção por Contêiner - Framework

O Spring Boot implementa injeção de dependências através de um contêiner chamado Spring IoC Container.

Esse contêiner é responsável por gerenciar todas as dependências do projeto de forma automática

  • Beans

    Os objetos gerenciados pelo contêiner do Spring são chamados de Beans. Uma aplicação rodando pode ter vários beans.

    A forma mais comum de declarar um bean é usando a notação @Component.

  • Declarando Bean

    @Component
    public class TaxService {
    	//metodos legais
    }
    
  • Injeção

    Para a injeção de dependência utilizaremos a notação @Autowired.

    @Service
    public class SalaryService {
    
    	@Autowired
    	private TaxService taxService;
    	
    	//metodos legais
    }
    

Extras

Mais sobre Injeção de Dependência: https://blog.algaworks.com/injecao-de-dependencias-spring/