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 / EJB3J2EE Design and Development
2002 J2EE = EJB 2.x
Só havia um pequeno problema:
o tempo gasto com requisitosnão funcionais muitas vezes era MAIORque 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 bi2009 – VMWare compra SpringSource por US$420 mi2013 - 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çãocom 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;
@RestControllerpublic 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;
@SpringBootApplicationpublic 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–MongoDBpackage com.example;
import java.time.LocalDate;import java.util.List;
import org.springframework.data.annotation.Id;
public class Meetup {
@Idprivate 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;
}
@Overridepublic String toString() {
return "Meetup [titulo=" + titulo + ", data=" + data + ", participantes=" + participantes + "]";
} // getters e setters
Adicionar suporte ao Spring Data–MongoDBpackage 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@SpringBootApplicationpublic class SampleMongoApplication implements CommandLineRunner {
@Autowiredprivate MeetupRepository repository;
@Overridepublic 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";
// gravandoSystem.out.println("Gravando:");System.out.println("-------------------------------");this.repository.save(
new Meetup(titulo, diaDoMeetup, participantes ));
Adicionar suporte ao Spring Data–MongoDB
// buscandoSystem.out.println("Busca todos:");System.out.println("-------------------------------");for (Meetup meetup : this.repository.findAll()) {
System.out.println(meetup);}System.out.println();
// buscando por tituloSystem.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 ReSTpackage 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 {
@Autowiredprivate 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@AutoConfigureMockMvcpublic 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...
Top Related