Que tipos de injeção de dependências você conhece?
sobes.tech IA
Resposta da IA
Existem três tipos principais de injeção de dependências:
-
Injeção através do construtor (Constructor Injection): As dependências são fornecidas à classe através do seu construtor. A classe não pode ser criada sem fornecer todas as dependências necessárias. Isto garante uma especificação clara das dependências e facilita os testes.
public class SomeService { private final Dependency dependency; public SomeService(Dependency dependency) { // Injeção através do construtor this.dependency = dependency; } public void doSomething() { dependency.execute(); } } -
Injeção através do setter (Setter Injection): As dependências são fornecidas à classe através de métodos públicos setters. Isto torna a classe mais flexível em termos de configuração, mas não garante a provisão de todas as dependências na criação do objeto.
public class AnotherService { private Dependency dependency; public void setDependency(Dependency dependency) { // Injeção através do setter this.dependency = dependency; } public void doSomethingElse() { if (dependency != null) { dependency.execute(); } else { // Lidar com o caso de dependência ausente } } } -
Injeção através da interface (Interface Injection): Menos comum, onde a classe dependente deve implementar uma interface que fornece um setter para a dependência. O injetor usa esta interface para fornecer a dependência.
// Interface que define o método para injetar a dependência public interface DependencyInjectable { void setDependency(Dependency dependency); } public class YetAnotherService implements DependencyInjectable { private Dependency dependency; @Override public void setDependency(Dependency dependency) { // Implementação do método da interface this.dependency = dependency; } public void performAction() { if (dependency != null) { dependency.execute(); } } }
Comparação dos métodos:
| Método | Vantagens | Desvantagens | Casos de uso típicos |
|---|---|---|---|
| Através do construtor | Especificação clara de dependências, imutabilidade | Muitas dependências podem levar a um construtor "inchado" | Dependências obrigatórias, criação de objetos imutáveis |
| Através do setter | Dependências opcionais, flexibilidade de configuração | Não garante a presença da dependência, estado modificável | Dependências opcionais, herança, configuração após criação |
| Através da interface | Menos comum | Complexidade adicional | Cenários raros que requerem um método de injeção padronizado |
A abordagem mais preferida na maioria dos casos é a injeção através do construtor, especialmente para dependências obrigatórias, pois define claramente o contrato da classe e favorece a criação de objetos em um estado correto. A injeção através do setter é conveniente para dependências opcionais ou quando há muitas dependências para evitar construtores longos. A injeção através da interface é menos comum e pode ser útil em frameworks específicos ou quando é necessário padronizar o processo de injeção.