[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
motordepende dabateria - Porém, a
base de encaixedabateriaé fora domotor
"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
Adepende deB,ANÃO deve ter controle sobre essa dependência.
Ou seja, se for preciso mudar oBnão será preciso mudar oA. - É preciso
trocar o controle.
Ou seja, o controle da dependência deve ficar fora doA
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êinerdoSpringsão chamados deBeans.
Uma aplicação rodando pode ter váriosbeans.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ênciautilizaremos 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/