Aumente sua produtividade
com Spring Boot
Fernando Boaglio
Quem é Fernando Boaglio ?
8 Javeiros que você deveria conhecer !
8 Javeiros que você deveria conhecer !
James Gosling Joshua Bloch Duncan Davison Marc Fleury
Rod Johnson Kent Beck Craig Mcclanahan Gavin King
8 Javeiros que você deveria conhecer !
Criador do Java JDK 5 / Effective Java Tomcat / ANT JBoss
Expert One-on-One XP / TDD / Junit Struts Hibernate / EJB3
J2EE Design and
Development
2002 J2EE = EJB 2.x
Só havia um pequeno problema:
o tempo gasto com requisitos
não funcionais muitas vezes era
MAIOR
que com os funcionais.
Objetivos de Rod Johnson
- desenvolvimento mais simples que o J2EE
- voltado para interfaces
- bom design OO
- facilitar a criação de testes
- agradável de usar
- deve integrar com soluções existentes
- open source
2004 Spring 1.0
Enquanto isso...
2008 - empresa Interface 21 renomeada
SpringSource
2009 – Oracle compra Sun Microsystems
por US$13 bi
2009 – VMWare compra SpringSource
por US$420 mi
2013 - VMware + EMC cria a Pivotal, focada
em sistemas (Spring vai junto)
Linha do tempo Java EE e Spring
2015
2016
Spring projects em 2003
Spring projects em 2016 (resumido)
Motivo 1 para criação do Spring Boot
O crescimento do Spring trouxe problemas!
- muitos módulos
- muitas dependências
- configuração já não é tão simples
O crescimento dos Micro Services
servidor pesado rodando uma aplicação
com 10 serviços é trocado por 10 servidores
leves rodando apenas um serviço
Motivo 2 para criação do Spring Boot
Vamos ao que interessa… como usar???
Baixe e instale o Spring Tools Suite
https://spring.io/tools
Criando um projeto exemplo
Criando um projeto exemplo
Criando um projeto exemplo online
Rodando o projeto exemplo
Rodando o projeto exemplo
Acessando a raiz
Criando uma tela inicial
package com.example;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TesteController {
@RequestMapping("/")
String home() {
return "Olá Javeiros!";
}
}
Acessando a raiz
Arquivo 1 de 2 gerado – pom.xml (Maven)
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.4.0.RELEASE</version>relativePath /> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
Arquivo 2 de 2 gerado – Java
package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Muitas coisas aconteram
- Servidor leve no ar
- Dependências carregadas
automaticamente
- Dependências configuradas
automaticamente
- Convenção sobre configuração
Adicionar suporte ao Spring Data–MongoDB
package com.example;
import java.time.LocalDate;
import java.util.List;
import org.springframework.data.annotation.Id;
public class Meetup {
@Id
private String titulo;
private LocalDate data;
private List<String> participantes;
public Meetup() {
}
public Meetup(String titulo, LocalDate data, List<String> participantes) {
this.titulo = titulo;
this.data = data;
this.participantes = participantes;
}
@Override
public String toString() {
return "Meetup [titulo=" + titulo + ", data=" + data + ", participantes=" + participantes + "]";
}
// getters e setters
Adicionar suporte ao Spring Data–MongoDB
package com.example;
import java.util.List;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface MeetupRepository extends MongoRepository<Meetup, String> {
public Meetup findByTitulo(String titulo);
public List<Meetup> findAll();
}
Adicionado suporte ao MongoDB
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Adicionar suporte ao Spring Data–MongoDB
@SpringBootApplication
public class SampleMongoApplication implements CommandLineRunner {
@Autowired
private MeetupRepository repository;
@Override
public void run(String... args) throws Exception {
this.repository.deleteAll();
List<String> participantes = new ArrayList<String>();
participantes.add("Bruno");
participantes.add("Felipe");
participantes.add("Fernando");
LocalDate diaDoMeetup = LocalDate.of(2016, Month.SEPTEMBER, 1);
String titulo ="12o Meetup";
// gravando
System.out.println("Gravando:");
System.out.println("-------------------------------");
this.repository.save(
new Meetup(titulo, diaDoMeetup, participantes ));
Adicionar suporte ao Spring Data–MongoDB
// buscando
System.out.println("Busca todos:");
System.out.println("-------------------------------");
for (Meetup meetup : this.repository.findAll()) {
System.out.println(meetup);
}
System.out.println();
// buscando por titulo
System.out.println("Busca por titulo:");
System.out.println("--------------------------------");
System.out.println(this.repository.findByTitulo(titulo));
}
public static void main(String[] args) throws Exception {
SpringApplication.run(SampleMongoApplication.class, args);
}
}
Adicionar suporte ao Spring Data–MongoDB
Adicionar suporte ao Spring Data–MongoDB
Comentando findAll também funciona!
package com.example;
import org.springframework.data.mongodb.repository.MongoRepository;
public interface MeetupRepository
extends MongoRepository<Meetup, String> {
public Meetup findByTitulo
(String titulo);
}
Adicionado suporte ao MongoDB + ReST
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
Adicionar suporte ReST
package com.example;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/meetup")
public class MeetupController {
@Autowired
private MeetupRepository repository;
@RequestMapping(method = RequestMethod.GET)
public List<Meetup> findAll() {
return repository.findAll();
}
@RequestMapping(value = "{titulo}", method = RequestMethod.GET)
Meetup findById(@PathVariable("titulo") String titulo) {
return repository.findByTitulo(titulo);
}
}
Testando os serviços criados
Testando os serviços criados
Testando os serviços ReST
@RunWith(SpringRunner.class)
@SpringBootTest
@AutoConfigureMockMvc
public class DemoApplicationTests {
@Autowired
private MockMvc mockMvc;
@Test
public void apiNoAr() throws Exception {
this.mockMvc.perform(get("/api/meetup")).
andDo(print()).
andExpect(status().isOk());
}
@Test
public void apiBuscaTodos() throws Exception {
this.mockMvc.perform(get("/api/meetup")).andDo(print())
.andExpect(status().isOk())
.andExpect(jsonPath("$[0].titulo").value("12o Meetup"));
}
}
Deploy do seu microserviço
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<executable>true</executable>
<mainClass>com.example.DemoApplication</mainClass>
</configuration>
</plugin>
</plugins>
</build>
Deploy do seu microserviço
$ mvn package
Results :
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0
[INFO]
[INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ demo ---
[INFO] Building jar: /home/fb/workspace-sts/demo/target/demo-0.0.1-SNAPSHOT.jar
[INFO]
[INFO] --- spring-boot-maven-plugin:1.4.0.RELEASE:repackage (default) @ demo ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.346 s
[INFO] Finished at: 2016-08-28T14:55:14-03:00
[INFO] Final Memory: 29M/233M
[INFO] ------------------------------------------------------------------------
Executando seu microserviço
$ java -jar <arquivo-gerado>.jar
Gerar um WAR do seu serviço
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
E tem mais...
- Integração com Spring Cloud
- Eureka
- Hystrix
Leitura recomendada de Spring...
Em breve mais um livro...

Aumente sua produtividade com Spring Boot

  • 1.
    Aumente sua produtividade comSpring Boot Fernando Boaglio
  • 2.
  • 3.
    8 Javeiros quevocê deveria conhecer !
  • 4.
    8 Javeiros quevocê deveria conhecer ! James Gosling Joshua Bloch Duncan Davison Marc Fleury Rod Johnson Kent Beck Craig Mcclanahan Gavin King
  • 5.
    8 Javeiros quevocê deveria conhecer ! Criador do Java JDK 5 / Effective Java Tomcat / ANT JBoss Expert One-on-One XP / TDD / Junit Struts Hibernate / EJB3 J2EE Design and Development
  • 6.
    2002 J2EE =EJB 2.x
  • 7.
    Só havia umpequeno problema: o tempo gasto com requisitos não funcionais muitas vezes era MAIOR que com os funcionais.
  • 8.
    Objetivos de RodJohnson - desenvolvimento mais simples que o J2EE - voltado para interfaces - bom design OO - facilitar a criação de testes - agradável de usar - deve integrar com soluções existentes - open source
  • 9.
  • 10.
    Enquanto isso... 2008 -empresa Interface 21 renomeada SpringSource 2009 – Oracle compra Sun Microsystems por US$13 bi 2009 – VMWare compra SpringSource por US$420 mi 2013 - VMware + EMC cria a Pivotal, focada em sistemas (Spring vai junto)
  • 11.
    Linha do tempoJava EE e Spring
  • 12.
  • 13.
  • 14.
  • 15.
    Spring projects em2016 (resumido)
  • 17.
    Motivo 1 paracriação do Spring Boot O crescimento do Spring trouxe problemas! - muitos módulos - muitas dependências - configuração já não é tão simples
  • 18.
    O crescimento dosMicro Services servidor pesado rodando uma aplicação com 10 serviços é trocado por 10 servidores leves rodando apenas um serviço Motivo 2 para criação do Spring Boot
  • 19.
    Vamos ao queinteressa… como usar???
  • 20.
    Baixe e instaleo Spring Tools Suite https://spring.io/tools
  • 21.
  • 22.
  • 23.
    Criando um projetoexemplo online
  • 24.
  • 25.
  • 26.
  • 27.
    Criando uma telainicial package com.example; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; @RestController public class TesteController { @RequestMapping("/") String home() { return "Olá Javeiros!"; } }
  • 28.
  • 29.
    Arquivo 1 de2 gerado – pom.xml (Maven) <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.4.0.RELEASE</version>relativePath /> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
  • 30.
    Arquivo 2 de2 gerado – Java package com.example; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
  • 31.
    Muitas coisas aconteram -Servidor leve no ar - Dependências carregadas automaticamente - Dependências configuradas automaticamente - Convenção sobre configuração
  • 32.
    Adicionar suporte aoSpring Data–MongoDB package com.example; import java.time.LocalDate; import java.util.List; import org.springframework.data.annotation.Id; public class Meetup { @Id private String titulo; private LocalDate data; private List<String> participantes; public Meetup() { } public Meetup(String titulo, LocalDate data, List<String> participantes) { this.titulo = titulo; this.data = data; this.participantes = participantes; } @Override public String toString() { return "Meetup [titulo=" + titulo + ", data=" + data + ", participantes=" + participantes + "]"; } // getters e setters
  • 33.
    Adicionar suporte aoSpring Data–MongoDB package com.example; import java.util.List; import org.springframework.data.mongodb.repository.MongoRepository; public interface MeetupRepository extends MongoRepository<Meetup, String> { public Meetup findByTitulo(String titulo); public List<Meetup> findAll(); }
  • 34.
    Adicionado suporte aoMongoDB <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
  • 35.
    Adicionar suporte aoSpring Data–MongoDB @SpringBootApplication public class SampleMongoApplication implements CommandLineRunner { @Autowired private MeetupRepository repository; @Override public void run(String... args) throws Exception { this.repository.deleteAll(); List<String> participantes = new ArrayList<String>(); participantes.add("Bruno"); participantes.add("Felipe"); participantes.add("Fernando"); LocalDate diaDoMeetup = LocalDate.of(2016, Month.SEPTEMBER, 1); String titulo ="12o Meetup"; // gravando System.out.println("Gravando:"); System.out.println("-------------------------------"); this.repository.save( new Meetup(titulo, diaDoMeetup, participantes ));
  • 36.
    Adicionar suporte aoSpring Data–MongoDB // buscando System.out.println("Busca todos:"); System.out.println("-------------------------------"); for (Meetup meetup : this.repository.findAll()) { System.out.println(meetup); } System.out.println(); // buscando por titulo System.out.println("Busca por titulo:"); System.out.println("--------------------------------"); System.out.println(this.repository.findByTitulo(titulo)); } public static void main(String[] args) throws Exception { SpringApplication.run(SampleMongoApplication.class, args); } }
  • 37.
    Adicionar suporte aoSpring Data–MongoDB
  • 38.
    Adicionar suporte aoSpring Data–MongoDB
  • 39.
    Comentando findAll tambémfunciona! package com.example; import org.springframework.data.mongodb.repository.MongoRepository; public interface MeetupRepository extends MongoRepository<Meetup, String> { public Meetup findByTitulo (String titulo); }
  • 40.
    Adicionado suporte aoMongoDB + ReST <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-rest</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
  • 41.
    Adicionar suporte ReST packagecom.example; import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/meetup") public class MeetupController { @Autowired private MeetupRepository repository; @RequestMapping(method = RequestMethod.GET) public List<Meetup> findAll() { return repository.findAll(); } @RequestMapping(value = "{titulo}", method = RequestMethod.GET) Meetup findById(@PathVariable("titulo") String titulo) { return repository.findByTitulo(titulo); } }
  • 42.
  • 43.
  • 44.
    Testando os serviçosReST @RunWith(SpringRunner.class) @SpringBootTest @AutoConfigureMockMvc public class DemoApplicationTests { @Autowired private MockMvc mockMvc; @Test public void apiNoAr() throws Exception { this.mockMvc.perform(get("/api/meetup")). andDo(print()). andExpect(status().isOk()); } @Test public void apiBuscaTodos() throws Exception { this.mockMvc.perform(get("/api/meetup")).andDo(print()) .andExpect(status().isOk()) .andExpect(jsonPath("$[0].titulo").value("12o Meetup")); } }
  • 45.
    Deploy do seumicroserviço <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <executable>true</executable> <mainClass>com.example.DemoApplication</mainClass> </configuration> </plugin> </plugins> </build>
  • 46.
    Deploy do seumicroserviço $ mvn package Results : Tests run: 2, Failures: 0, Errors: 0, Skipped: 0 [INFO] [INFO] --- maven-jar-plugin:2.6:jar (default-jar) @ demo --- [INFO] Building jar: /home/fb/workspace-sts/demo/target/demo-0.0.1-SNAPSHOT.jar [INFO] [INFO] --- spring-boot-maven-plugin:1.4.0.RELEASE:repackage (default) @ demo --- [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 8.346 s [INFO] Finished at: 2016-08-28T14:55:14-03:00 [INFO] Final Memory: 29M/233M [INFO] ------------------------------------------------------------------------
  • 47.
    Executando seu microserviço $java -jar <arquivo-gerado>.jar
  • 48.
    Gerar um WARdo seu serviço <groupId>com.example</groupId> <artifactId>demo</artifactId> <version>0.0.1-SNAPSHOT</version> <packaging>war</packaging>
  • 49.
    E tem mais... -Integração com Spring Cloud - Eureka - Hystrix
  • 50.
  • 51.
    Em breve maisum livro...