[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
:strip_icc()/i.s3.glbimg.com/v1/AUTH_59edd422c0c84a879bd37670ae4f538a/internal_photos/bs/2019/f/L/SmloxRT6q89Rm4IvF7Vw/baterias-heliar.jpg)
- No carro, o
motor
depende dabateria
- Porém, a
base de encaixe
dabateria
é 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
A
depende deB
,A
NÃO deve ter controle sobre essa dependência.
Ou seja, se for preciso mudar oB
nã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 TaxService
dentro 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
doSpring
sã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ê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/