Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

Prévia do material em texto

Sem DI
Com DI
IoC e DI
IoC
É um princípio fundamental da arquitetura de software.
Determina que módulos de alto nível (lógica de negócio) não devem depender de
módulos de baixo nível (aplicação de execução)
Vantagens:
Melhora a flexibilidade do sistema
Resolve o problema de alto acoplamento
Ao invés de uma classe depender diretamente de outras, ela deve depender de uma
interface
Facilita manutenção e a evolução do código
A classe não precisa conhecer ou instanciar diretamente suas dependências
O gerenciamento das instâncias fica em um contêiner ou framework externo
DI
É um design pattern usado para implementar a IoC
Ao invés de uma classe criar e gerenciar diretamente seus objetos dependentes, ela
recebe essas dependências de um contêiner de DI
Permite que diferentes implementações da dependência sejam injetas no mesmo
código, sem alterar a classe dependente
public class PedidoService {
 private EstoqueService estoqueService;
 public PedidoService() {
 this.estoqueService = new EstoqueService(); 
 // Criação manual da dependência
 }
}
IoC e DI
1 / 6
af://h1-0
af://h2-1
af://h2-2
public class PedidoService {
 private EstoqueService estoqueService;
 // EstoqueService é "injetado" no construtor de PedidoService
 public PedidoService(EstoqueService estoqueService) {
 this.estoqueService = estoqueService;
 }
}
O Spring implementa nativamente um contêiner de DI
Ele é responsável por:
Criar as instâncias de cada classe e de suas dependências
Gerenciar o ciclo de vida dos objetos
Injetar as dependências automaticamente onde for necessário, seguindo uma
configuração (através de XML, código Java ou anotações)
Benefícios:
Reduz acoplamento
Flexibilidade
Permite facilmente alterar as implementações das interfaces
Facilidade de Testes e Manutenção
Anotações DI
Quais classes o Spring deve gerenciar: @Component, @Service, @Repository
Onde injetar as dependências: @Autowired
Qual instância usar em caso de conflito: @Principal ou @Primary e @Qualifier
@Component
Indica que a classe é um componente gerenciado pelo contêiner Spring
O Spring vai gerenciar o ciclo de vida dessa classe automaticamente, a tornando
uma candidata para injeção de dependência em outras classes
O Spring detecta automaticamente e cria uma instância dela com escopo singleton
(única instância no contêiner)
@Autowired
Indica ao Spring que ele deve injetar automaticamente uma instância da classe
especificada
Injeção de dependência automática de componentes gerenciados pelos contêiner
Pode ser usada em campos, construtores ou métodos
IoC e DI
2 / 6
af://h3-3
af://h5-4
af://h5-5
@Component
public class PedidoService {
@Autowired // Injeção automática de EstoqueService
private EstoqueService estoqueService;
// Outra opção: injeção no construtor
@Autowired
public PedidoService(EstoqueService estoqueService) {
 this.estoqueService = estoqueService;
}
}
@Service
É uma especialização de @Component
Indica que a classe é um serviço, portanto, implementa lógica de negócios
@Repository
Outra especialização de @Component
Usada para classes que manipulam operações de persistência de dados
Habilita o tratamento automático de exceções de persistência
@Entity
É uma anotação JPA
Marca uma classe como entidade de persistência
Indica que a classe está mapeada para uma tabela no BD
@Entity
public class Pedido {
 @Id
 private Long id;
 private String descricao;
 // getters e setters
}
IoC e DI
3 / 6
af://h5-6
af://h5-7
af://h5-8
Anotações para solução de conflitos
@Principal ou @Primary
Define qual bean (instância de classe gerenciada pelo Spring) deve ser prioritário
quando houver múltiplas opções para injeção
Útil se tiver várias implementações para uma interface
@Qualifier
Fornece um nome específico para um bean
Usado para distinguir entre várias implementações da mesma interface
@Component("estoqueExterno")
public class EstoqueExternoService implements EstoqueService {
 // lógica do serviço de estoque externo
}
@Component("estoqueInterno")
public class EstoqueInternoService implements EstoqueService {
 // lógica do serviço de estoque interno
}
@Service
public class PedidoService {
 @Autowired
 @Qualifier("estoqueExterno") // especifica a implementação a ser 
usada
 private EstoqueService estoqueService;
}
Tipos de Injeção de Dependência
Por construtor:
Garante que a dependência seja configurada no momento da criação do objeto
IoC e DI
4 / 6
af://h4-9
af://h5-10
af://h5-11
af://h3-12
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PedidoService {
 private final EstoqueService estoqueService;
 // Construtor com injeção de dependência
 @Autowired
 public PedidoService(EstoqueService estoqueService) {
 this.estoqueService = estoqueService;
 }
 public void processarPedido() {
 estoqueService.atualizarEstoque();
 }
}
Por método setter:
Permite que a dependência seja configurada ou alterada depois que o objeto é
criado
Mais flexível
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PedidoService {
 private EstoqueService estoqueService;
 // Método setter com injeção de dependência
 @Autowired
 public void setEstoqueService(EstoqueService estoqueService) {
 this.estoqueService = estoqueService;
 }
 public void processarPedido() {
 estoqueService.atualizarEstoque();
 }
}
IoC e DI
5 / 6
Por campo:
Feita usando @Autowired
É o método mais simples, mas menos flexível
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class PedidoService {
 // Injeção direta no campo
 @Autowired
 private EstoqueService estoqueService;
 public void processarPedido() {
 estoqueService.atualizarEstoque();
 }
}
IoC e DI
6 / 6
	IoC e DI
	IoC
	DI
	Anotações DI
	@Component
	@Autowired
	@Service
	@Repository
	@Entity
	Anotações para solução de conflitos
	@Principal ou @Primary
	@Qualifier
	Tipos de Injeção de Dependência

Mais conteúdos dessa disciplina