Injeção de Dependências e Spring
Daniel Cukier
@danicuki
@danicuki
Conteúdo
■ Exemplo – Melhor maneira de aprender
■ Injeção de Dependência (DI)
■ Spring Boot
■ https://github.com/danicuki/springExample
2
@danicuki
Exemplo
public class PhoneLister {
public List<Phone> phonesOwnedByCompany(String arg) {
List<Phone> allPhones = finder.findAll();
for (Phone phone : new ArrayList<Phone>(allPhones)) {
if (!phone.getCompany().equals(arg))
allPhones.remove(phone);
}
return allPhones;
}
}
3
@danicuki
Exemplo
public interface PhoneFinder {
List<Phone> findAll();
}
public class PhoneLister {
private PhoneFinder finder;
public PhoneLister() {
finder = new FakePhoneFinder();
}
}
4
Criando interface
Criação de instância continua obrigatória
@danicuki
Exemplo - Dependência
5
■ PhoneLister depende da interface e da implementação
■ Como depender somente da interface?
@danicuki
Idéia Básica - Assembler
6
@danicuki
Tipo de Injeção de Dependência
■ Injeção por construtor (IoC tipo 3)
■ Injeção por setter (IoC tipo 2)
■ Injeção por interface (IoC tipo 1 – menos usada)
7
*IoC – Inversion of Control
@danicuki
Por construtor
public class PhoneLister {
public PhoneLister(PhoneFinder finder) {
this.finder = finder;
}
@Autowired
private PhoneFinder finder;
}
@Component
public class FakePhoneFinder implements PhoneFinder {
public FakePhoneFinder() {
}
}
8
@danicuki
Spring
● Focado em prover uma forma de gerenciar seus
objetos de negócio
● Arquiteturado em camadas, modular. Podem ser
usadas apenas partes
● Ajuda a escrever código que é fácil de testar
9
@danicuki
Spring - Arquitetura
● Ajuda a eliminar proliferação de singletons
● Menos arquivos de configurações em vários formatos
diferentes
● Facilita boas práticas de programação: uso de interfaces no
lugar de classes
● Não invasivo: o código do sistema depende o mínimo possível
da API do Spring
● Fácil de escrever testes de unidade e também de integração
(usando TestContext Framework)
10
@danicuki
Spring – Inversão de Controle
● Fábrica de objetos
− Singleton
● Instância única compartilhada do objeto
● Uso padrão, mais comum
● Objetos de serviço sem estado (stateless)
− Protótipos
● Cada chamada cria um novo objeto
− Escopos de Objetos Customizados
● Objetos armazenados fora do controle do container (ex: request, session
em uma aplicação Web)
11
@danicuki
Spring - Resumo
“É uma tenologia dedicada a habilitar você a construir aplicações
usando objetos puros. Permite que você crie componentes
contendo somente lógica de negócio, enquando o Spring toma
conta de outras coisas importantes que você precisa numa
aplicação corporativa, mesmo em áreas que você nem havia
considerado antes de contruir sua aplicação”
12
@danicuki
Spring - Injeção de Dependência
● Como os componentes não precisam procurar
colaboradores em tempo de execução, o código fica mais
fácil de escrever e manter
● Testes mais fáceis: é só criar objetos e atribuir as
propriedades desejadas usando os setters
● Dependências são explícitas e evidentes
● Objetos de negócio não dependem da API do Spring
13
@danicuki
Múdulos Spring
14
@danicuki
Por setter: Spring
15
@Component
public class PhoneLister {
@Autowired
private PhoneFinder finder;
public void setFinder(PhoneFinder finder) {
this.finder = finder;
}
}
@danicuki
Aplicação Spring Boot em passos
■ https://start.spring.io/
■ Add code
■ ./mvnw spring-boot:run
16
@danicuki
Outros Arcabouços
● PicoContainer
http://www.picocontainer.com/
uso de anotações no lugar de XML
● Google Guice
https://github.com/google/guice
também usa anotações
17
@danicuki
DI – Linha do Tempo
18
@danicuki
Construtor ou Setter?
■ Construtor com parâmetros deixa claro o que é preciso para criar o
objeto
■ Usando construtor evita campos imutáveis de serem alterados
■ Cuidado: contrutores com muitos parâmetros pode ser um indicativo de
objeto com responsabilidades demais
■ Construtor é ruim se tiver parâmetros simples como Strings: com setter
você cria um método que identifica o que a string significa
■ Receita geral: comece com construtor e mude para setter se a coisa ficar
complicada demais
19
@danicuki
Spring - Mercado
■ Serviços: segurança, gerenciador de sistemas,
workflow, persistência
■ Melhorias: vários releases por ano
■ Suporte: muitos arcabouços consagrados e
produtos do mercado usam Spring
■ Vasta literatura e documentação.
20
@danicuki
Daniel Cukier - IME/USP
Service Locator
■ Singleton que provê
serviços
21
class PhoneLister...
PhoneFinder finder =
ServiceLocator.phoneFinder();
class ServiceLocator...
public static PhoneFinder phoneFinder() {
return soleInstance.phoneFinder;
}
private static ServiceLocator soleInstance =
new ServiceLocator(new MySqlPhoneFinder("myDBName"));
private PhoneFinder phoneFinder;
...
@danicuki
Referências
■ https://spring.io/
■ http://martinfowler.com/articles/injection.html
■ Anil Hemrajani, Agile Java Development with Spring, Hibernate and Eclipse
22

Spring e Injeção de Dependência

  • 1.
    Injeção de Dependênciase Spring Daniel Cukier @danicuki
  • 2.
    @danicuki Conteúdo ■ Exemplo –Melhor maneira de aprender ■ Injeção de Dependência (DI) ■ Spring Boot ■ https://github.com/danicuki/springExample 2
  • 3.
    @danicuki Exemplo public class PhoneLister{ public List<Phone> phonesOwnedByCompany(String arg) { List<Phone> allPhones = finder.findAll(); for (Phone phone : new ArrayList<Phone>(allPhones)) { if (!phone.getCompany().equals(arg)) allPhones.remove(phone); } return allPhones; } } 3
  • 4.
    @danicuki Exemplo public interface PhoneFinder{ List<Phone> findAll(); } public class PhoneLister { private PhoneFinder finder; public PhoneLister() { finder = new FakePhoneFinder(); } } 4 Criando interface Criação de instância continua obrigatória
  • 5.
    @danicuki Exemplo - Dependência 5 ■PhoneLister depende da interface e da implementação ■ Como depender somente da interface?
  • 6.
  • 7.
    @danicuki Tipo de Injeçãode Dependência ■ Injeção por construtor (IoC tipo 3) ■ Injeção por setter (IoC tipo 2) ■ Injeção por interface (IoC tipo 1 – menos usada) 7 *IoC – Inversion of Control
  • 8.
    @danicuki Por construtor public classPhoneLister { public PhoneLister(PhoneFinder finder) { this.finder = finder; } @Autowired private PhoneFinder finder; } @Component public class FakePhoneFinder implements PhoneFinder { public FakePhoneFinder() { } } 8
  • 9.
    @danicuki Spring ● Focado emprover uma forma de gerenciar seus objetos de negócio ● Arquiteturado em camadas, modular. Podem ser usadas apenas partes ● Ajuda a escrever código que é fácil de testar 9
  • 10.
    @danicuki Spring - Arquitetura ●Ajuda a eliminar proliferação de singletons ● Menos arquivos de configurações em vários formatos diferentes ● Facilita boas práticas de programação: uso de interfaces no lugar de classes ● Não invasivo: o código do sistema depende o mínimo possível da API do Spring ● Fácil de escrever testes de unidade e também de integração (usando TestContext Framework) 10
  • 11.
    @danicuki Spring – Inversãode Controle ● Fábrica de objetos − Singleton ● Instância única compartilhada do objeto ● Uso padrão, mais comum ● Objetos de serviço sem estado (stateless) − Protótipos ● Cada chamada cria um novo objeto − Escopos de Objetos Customizados ● Objetos armazenados fora do controle do container (ex: request, session em uma aplicação Web) 11
  • 12.
    @danicuki Spring - Resumo “Éuma tenologia dedicada a habilitar você a construir aplicações usando objetos puros. Permite que você crie componentes contendo somente lógica de negócio, enquando o Spring toma conta de outras coisas importantes que você precisa numa aplicação corporativa, mesmo em áreas que você nem havia considerado antes de contruir sua aplicação” 12
  • 13.
    @danicuki Spring - Injeçãode Dependência ● Como os componentes não precisam procurar colaboradores em tempo de execução, o código fica mais fácil de escrever e manter ● Testes mais fáceis: é só criar objetos e atribuir as propriedades desejadas usando os setters ● Dependências são explícitas e evidentes ● Objetos de negócio não dependem da API do Spring 13
  • 14.
  • 15.
    @danicuki Por setter: Spring 15 @Component publicclass PhoneLister { @Autowired private PhoneFinder finder; public void setFinder(PhoneFinder finder) { this.finder = finder; } }
  • 16.
    @danicuki Aplicação Spring Bootem passos ■ https://start.spring.io/ ■ Add code ■ ./mvnw spring-boot:run 16
  • 17.
    @danicuki Outros Arcabouços ● PicoContainer http://www.picocontainer.com/ usode anotações no lugar de XML ● Google Guice https://github.com/google/guice também usa anotações 17
  • 18.
  • 19.
    @danicuki Construtor ou Setter? ■Construtor com parâmetros deixa claro o que é preciso para criar o objeto ■ Usando construtor evita campos imutáveis de serem alterados ■ Cuidado: contrutores com muitos parâmetros pode ser um indicativo de objeto com responsabilidades demais ■ Construtor é ruim se tiver parâmetros simples como Strings: com setter você cria um método que identifica o que a string significa ■ Receita geral: comece com construtor e mude para setter se a coisa ficar complicada demais 19
  • 20.
    @danicuki Spring - Mercado ■Serviços: segurança, gerenciador de sistemas, workflow, persistência ■ Melhorias: vários releases por ano ■ Suporte: muitos arcabouços consagrados e produtos do mercado usam Spring ■ Vasta literatura e documentação. 20
  • 21.
    @danicuki Daniel Cukier -IME/USP Service Locator ■ Singleton que provê serviços 21 class PhoneLister... PhoneFinder finder = ServiceLocator.phoneFinder(); class ServiceLocator... public static PhoneFinder phoneFinder() { return soleInstance.phoneFinder; } private static ServiceLocator soleInstance = new ServiceLocator(new MySqlPhoneFinder("myDBName")); private PhoneFinder phoneFinder; ...
  • 22.
    @danicuki Referências ■ https://spring.io/ ■ http://martinfowler.com/articles/injection.html ■Anil Hemrajani, Agile Java Development with Spring, Hibernate and Eclipse 22