SlideShare una empresa de Scribd logo
1 de 22
Descargar para leer sin conexión
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

Más contenido relacionado

Similar a Spring DI e Injeção de Dependência

Injeção de Dependência e Testes com Dublês
Injeção de Dependência e Testes com DublêsInjeção de Dependência e Testes com Dublês
Injeção de Dependência e Testes com DublêsDaniel Cukier
 
Apresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaApresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaGPrimola
 
Compartilhamento de código com Frameworks - CocoaHeads RJ
Compartilhamento de código com Frameworks - CocoaHeads RJCompartilhamento de código com Frameworks - CocoaHeads RJ
Compartilhamento de código com Frameworks - CocoaHeads RJRenan Protector
 
Node.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoNode.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoEduardo Bohrer
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com AngularElmano Cavalcanti
 
TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Coretdc-globalcode
 
Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...
Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...
Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...Renato Groff
 
Desmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest FrameworkDesmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest FrameworkBruno Oliveira
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Wellington Moreira
 
Aula04 android intents
Aula04 android intentsAula04 android intents
Aula04 android intentsRoberson Alves
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasRafael Chinelato Del Nero
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Frameworkelliando dias
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerDr. Spock
 
.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET
.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET
.NET Core + Selenium: extração de dados de páginas Web - Campinas .NETRenato Groff
 
Componentizando a Web com Polymer
Componentizando a Web com PolymerComponentizando a Web com Polymer
Componentizando a Web com PolymerStefan Horochovec
 

Similar a Spring DI e Injeção de Dependência (20)

Injeção de Dependência e Testes com Dublês
Injeção de Dependência e Testes com DublêsInjeção de Dependência e Testes com Dublês
Injeção de Dependência e Testes com Dublês
 
Apresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno CottaApresentacao android por Júlio Cesar Bueno Cotta
Apresentacao android por Júlio Cesar Bueno Cotta
 
Compartilhamento de código com Frameworks - CocoaHeads RJ
Compartilhamento de código com Frameworks - CocoaHeads RJCompartilhamento de código com Frameworks - CocoaHeads RJ
Compartilhamento de código com Frameworks - CocoaHeads RJ
 
Node.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançadoNode.JS - Workshop do básico ao avançado
Node.JS - Workshop do básico ao avançado
 
Introdução à Programação Web com Angular
Introdução à Programação Web com AngularIntrodução à Programação Web com Angular
Introdução à Programação Web com Angular
 
TDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net CoreTDC2016SP - Por dentro do .Net Core
TDC2016SP - Por dentro do .Net Core
 
Desenvolvendo com IONIC
Desenvolvendo com IONICDesenvolvendo com IONIC
Desenvolvendo com IONIC
 
TDC São Paulo 2019 - Vapor
TDC São Paulo 2019 - VaporTDC São Paulo 2019 - Vapor
TDC São Paulo 2019 - Vapor
 
Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...
Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...
Extração Automatizada de Dados da Web com Selenium WebDriver - Web Scraping -...
 
Desmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest FrameworkDesmitificando as aplicações RESTFul usando Django Rest Framework
Desmitificando as aplicações RESTFul usando Django Rest Framework
 
Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?Por quê você deve utilizar TDD?
Por quê você deve utilizar TDD?
 
Mean Stack
Mean StackMean Stack
Mean Stack
 
Php do Jeito Certo
Php do Jeito CertoPhp do Jeito Certo
Php do Jeito Certo
 
Aula04 android intents
Aula04 android intentsAula04 android intents
Aula04 android intents
 
ZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivasZeroBugsProject - Técnicas de programação efetivas
ZeroBugsProject - Técnicas de programação efetivas
 
Spring MVC Framework
Spring MVC FrameworkSpring MVC Framework
Spring MVC Framework
 
SpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm ServerSpringSource Tool Suite, tc Server e dm Server
SpringSource Tool Suite, tc Server e dm Server
 
.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET
.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET
.NET Core + Selenium: extração de dados de páginas Web - Campinas .NET
 
Componentizando a Web com Polymer
Componentizando a Web com PolymerComponentizando a Web com Polymer
Componentizando a Web com Polymer
 
Tutorial codeigniter
Tutorial codeigniterTutorial codeigniter
Tutorial codeigniter
 

Más de Daniel Cukier

Solidity: Zero to Hero Corporate Training
Solidity: Zero to Hero Corporate TrainingSolidity: Zero to Hero Corporate Training
Solidity: Zero to Hero Corporate TrainingDaniel Cukier
 
Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...
Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...
Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...Daniel Cukier
 
Startup Communities: From Nascence to Maturity
Startup Communities: From Nascence to MaturityStartup Communities: From Nascence to Maturity
Startup Communities: From Nascence to MaturityDaniel Cukier
 
Technology Startups Ecosystem in China - Lessons to other ecosystems
Technology Startups  Ecosystem in China - Lessons to other ecosystemsTechnology Startups  Ecosystem in China - Lessons to other ecosystems
Technology Startups Ecosystem in China - Lessons to other ecosystemsDaniel Cukier
 
Software Startup Ecosystems Evolution - The New York City Case Study
Software Startup Ecosystems Evolution - The New York City Case StudySoftware Startup Ecosystems Evolution - The New York City Case Study
Software Startup Ecosystems Evolution - The New York City Case StudyDaniel Cukier
 
Maturity model for Startup Ecosystems
Maturity model for Startup EcosystemsMaturity model for Startup Ecosystems
Maturity model for Startup EcosystemsDaniel Cukier
 
Why Google Cloud is so special? Stories from a cloud user
Why Google Cloud is so special?  Stories from a cloud userWhy Google Cloud is so special?  Stories from a cloud user
Why Google Cloud is so special? Stories from a cloud userDaniel Cukier
 
Software Architectures for a Single Person Team
Software Architectures for a Single Person TeamSoftware Architectures for a Single Person Team
Software Architectures for a Single Person TeamDaniel Cukier
 
Introduction to Functional Programming with Scala
Introduction to Functional Programming with ScalaIntroduction to Functional Programming with Scala
Introduction to Functional Programming with ScalaDaniel Cukier
 
O dia a dia de uma Startup
O dia a dia de uma StartupO dia a dia de uma Startup
O dia a dia de uma StartupDaniel Cukier
 
Selecting Empirical Methods for Software Engineering
Selecting Empirical Methods for Software EngineeringSelecting Empirical Methods for Software Engineering
Selecting Empirical Methods for Software EngineeringDaniel Cukier
 
Is Computer Science Science?
Is Computer Science Science?Is Computer Science Science?
Is Computer Science Science?Daniel Cukier
 
Better Science Through Art
Better Science Through ArtBetter Science Through Art
Better Science Through ArtDaniel Cukier
 
Designed as Designer
Designed as DesignerDesigned as Designer
Designed as DesignerDaniel Cukier
 
When Should You Consider Meta Architectures
When Should You Consider Meta ArchitecturesWhen Should You Consider Meta Architectures
When Should You Consider Meta ArchitecturesDaniel Cukier
 

Más de Daniel Cukier (20)

Solidity: Zero to Hero Corporate Training
Solidity: Zero to Hero Corporate TrainingSolidity: Zero to Hero Corporate Training
Solidity: Zero to Hero Corporate Training
 
Pair programming
Pair programmingPair programming
Pair programming
 
Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...
Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...
Eficiency and Low Cost: Pro Tips for you to save 50% of your money with Googl...
 
Startup Communities: From Nascence to Maturity
Startup Communities: From Nascence to MaturityStartup Communities: From Nascence to Maturity
Startup Communities: From Nascence to Maturity
 
Technology Startups Ecosystem in China - Lessons to other ecosystems
Technology Startups  Ecosystem in China - Lessons to other ecosystemsTechnology Startups  Ecosystem in China - Lessons to other ecosystems
Technology Startups Ecosystem in China - Lessons to other ecosystems
 
Software Startup Ecosystems Evolution - The New York City Case Study
Software Startup Ecosystems Evolution - The New York City Case StudySoftware Startup Ecosystems Evolution - The New York City Case Study
Software Startup Ecosystems Evolution - The New York City Case Study
 
Maturity model for Startup Ecosystems
Maturity model for Startup EcosystemsMaturity model for Startup Ecosystems
Maturity model for Startup Ecosystems
 
Why Google Cloud is so special? Stories from a cloud user
Why Google Cloud is so special?  Stories from a cloud userWhy Google Cloud is so special?  Stories from a cloud user
Why Google Cloud is so special? Stories from a cloud user
 
Software Architectures for a Single Person Team
Software Architectures for a Single Person TeamSoftware Architectures for a Single Person Team
Software Architectures for a Single Person Team
 
Startup Communities
Startup CommunitiesStartup Communities
Startup Communities
 
Introduction to Functional Programming with Scala
Introduction to Functional Programming with ScalaIntroduction to Functional Programming with Scala
Introduction to Functional Programming with Scala
 
Play vs Rails
Play vs RailsPlay vs Rails
Play vs Rails
 
O dia a dia de uma Startup
O dia a dia de uma StartupO dia a dia de uma Startup
O dia a dia de uma Startup
 
Selecting Empirical Methods for Software Engineering
Selecting Empirical Methods for Software EngineeringSelecting Empirical Methods for Software Engineering
Selecting Empirical Methods for Software Engineering
 
Is Computer Science Science?
Is Computer Science Science?Is Computer Science Science?
Is Computer Science Science?
 
Ruby Robots
Ruby RobotsRuby Robots
Ruby Robots
 
Better Science Through Art
Better Science Through ArtBetter Science Through Art
Better Science Through Art
 
Designed as Designer
Designed as DesignerDesigned as Designer
Designed as Designer
 
When Should You Consider Meta Architectures
When Should You Consider Meta ArchitecturesWhen Should You Consider Meta Architectures
When Should You Consider Meta Architectures
 
Coding Dojo
Coding DojoCoding Dojo
Coding Dojo
 

Spring DI e Injeção de Dependência

  • 1. Injeção de Dependências e 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?
  • 7. @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
  • 8. @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
  • 9. @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
  • 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ã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
  • 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çã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
  • 15. @danicuki Por setter: Spring 15 @Component public class PhoneLister { @Autowired private PhoneFinder finder; public void setFinder(PhoneFinder finder) { this.finder = finder; } }
  • 16. @danicuki Aplicação Spring Boot em passos ■ https://start.spring.io/ ■ Add code ■ ./mvnw spring-boot:run 16
  • 17. @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
  • 18. @danicuki DI – Linha do Tempo 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