Spring Boot

Le développement web en java

Complexité de la pile applicative

  • Le modèle MVC
  • La gestion de la sécurité
  • L'accès aux données (SQL, NoSQL)
  • Service cloud
  • Code boilerplate sans "valeur"

Meet Spring

  • Un framework open source java largement utilisé dans le développement java
  • Un écosystème Spring complet
  • Implémente l'injection de dépendances
  • Gain de temps via configurations et annotations

🍃Hands-on 1 : initialiser un projet Spring Boot

  1. Allez sur https://start.spring.io/ créez un projet spring boot.
  2. Lancez le main voir que le code fonctionne.

Anatomie du code minimal

  • Fichiers maven : pom.xml, mvnm, mvnm.cmd
  • Les packages classiques
    • src/main/java : java
    • src/main/resources : properties/template
    • src/test/java : test

Anatomie du code minimal


package fr.ensai.demo;

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {
        # Start the Spring framework
        SpringApplication.run(DemoApplication.class, args);
    }

}
                        

Les annotations

  • Permet de modifier le comportement d'une classe ou méthode
  • @SpringBootApplication =
    • @SpringBootConfiguration : la classe sera utilisée comme une classe de configuration.
    • @EnableAutoConfiguration : active la fonctionnalité d’autoconfiguration de Spring Boot.
    • @ComponentScan : active le “scanning” de classes dans le package de la classe et dans ses sous-packages.
  • Spring en utilise beaucoup mais ce n'est pas une propre à Spring
  • Equivalent en python, decorator (!= du pattern)

Les annotations

  • @Component : défini un bean Spring
  • @Qualifier : permet de nommer notre bean
  • @Autowired : permet d'appeler un bean
  • @SpringBootApplication : défini une application Spring Boot
  • D'autres dans le futur

🍃Hands-on 2 : Un premier hello world

  1. Créez une classe HelloWorldService qui implémente l'interface CommandLineRunner, et surchargez la méthode à implémenter pour afficher un hello world
  2. Faites de cette classe un beans Spring
  3. Lancez votre application
  4. Que se passe-t-il ?

IoC container/ Application Context

  • La fonctionnalité principale de Spring
  • Permet de découpler la création de l'utilisation (proche de la factory)
  • Code plus évolutif
  • Se base sur les abstractions
  • Faible couplage

Injection de dépendances 1


public class Command {
    private Product product;

    public Command() {
        this.product = new Product(“something”);
    }
}
                        

Injection de dépendances 2


public class Command (
    private Product product;
    public Product getProduct() {
        return product;
    }
    public void setProduct(Product product) { 
    // Passage de produit en paramètre, peu être une ss classe
        this.product = product;
    )
    public Command() { } // Constructeur plus léger
}
                        

Bilan

  • Disparition du new Product
  • Command doit recevoir un produit
  • Délégation à une tierce partie (factory)

Injection de dépendances en Spring

  • IoC Container
  • Annotation @Component pour les beans
  • Annotation @Autowired pour les utilisateurs des beans

@Component
public class FirstBean {
    public String toString (){
        return "Hello world"
    };
}
                        

@SpringBootApplication
public class DemoApplication {
    @Autowired
    private FirstBean firstBean;
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
        System.out.println(firstBean);
    }

}
                        

🍃Hands-on 3 : mes premiers beans

  1. Créez une classe BookService qui contient une liste de livre. La classe BookService est un bean spring.
  2. Créez une classe LibraryService. La classe LibraryService est un bean spring avec un attribut nom.
  3. Affichez les informations de vos beans.
  4. Est-ce que vos beans sont des singletons ?

Faire un webservice avec SpringBoot

Les starters Spring Boot

  • Collection de dépendances qui ont un but commun
  • Plus besoin de partir à le recherche des dépendances

                                
                                    org.springframework.boot
                                    spring-boot-starter-web
                                
                            

Définir des endpoints avec Spring


                                    @RestController
                                    @RequestMapping("/hello")
                                    public class HelloWorldController {
                                        @GetMapping("/world")
                                        public String helloWorld() {
                                            return "Hello world";
                                        }
                                    }
                            

Définir des endpoints avec Spring

  • @RestController : bean pour une API Rest
  • @RequestMapping("") : préfixe des endpoints de la classe
  • @GetMapping("") : définition d'un endpoint get
  • @PostMapping, @PatchMapping, @PutMapping, @DeleteMapping : les autres méthodes
  • Spring sérialise la réponse automatiquement (besoin de getter)

🍃Hands-on 4 : mon premier endpoint

  1. Allez sur https://start.spring.io/ et créez un projet spring boot.
  2. Prenez les starter web, h2, postgres et JPA
  3. Créez les packages services, model, controller
  4. Créez une classe Book avec les attributs titre, auteur et éditeur
  5. Créez une classe BookService avec une méthode getBooks qui retourne une liste de livre. Vous pouvez la hardcoder pour le moment
  6. Créez un classe LivreController qui expose un endpoints getBooks qui retourne une liste de livre

Communication avec une BDD 💾

Ou comment rendre trivial le projet de 2A

La notion d'ORM

  • Faire le lien entre base de donnée et code est laborieux
  • Hibernate : Outils générique pour faire le lien pojo-bdd utilisé par Spring

Lien entre un objet et une table


                                    @Entity
                                    @Table(name = "employees")
                                    public class Employee {
                                    
                                        @Id
                                        @GeneratedValue(strategy = GenerationType.IDENTITY)
                                        private Long id;
                                    
                                        @Column(name="first_name")
                                        private String firstName;
                                    
                                        @Column(name="last_name")
                                        private String lastName;
                                    
                                        private String mail;
                                    
                                        private String password;
                                    
                                    }
                            

Lien entre un objet et une table

  • Se base sur des annotations
  • @Entity : annotation pour dire que cet objet est lié à une base
  • @Table(name = "employees") : nom de la table si différent nom classe
  • @Column(name="first_name") : nom de la colonne de la table si différent attribut
  • @Id : cette colonne est une primary key
  • @GeneratedValue(strategy = GenerationType.IDENTITY) : c'est la base qui gère la clef primaire

Création des DAO en 1min

  • On a maintenant quelque chose qui représente une ligne
  • Besoin de méthodes pour requêter notre table
  • Interface CrudRepository < entity, ID > + annotation @Repository

Création des DAO en 1min


                                @Repository
                                public interface EmployeRepository extends CrudRepository < Employee, Long > {
                                }
                        

Pour un CRUD de base pas besoin de plus de code !!!

L'interface CrudRepository

doc officielle

                                @Service
                                public class EmployeeService {
                                
                                    @Autowired
                                    private EmployeRepository employeRepository;
                                
                                    public Optional<Employee> getEmployee(final Long id) {
                                        return employeRepository.findById(id);
                                    }
                                
                                    public Iterable<Employee> getEmployees() {
                                        return employeRepository.findAll();
                                    }
                                
                                    public void deleteEmployee(final Long id) {
                                        employeRepository.deleteById(id);
                                    }
                                
                                    public Employee saveEmployee(Employee employee) {
                                        Employee savedEmployee = employeRepository.save(employee);
                                        return savedEmployee;
                                    }
                                }
                        

Comment Spring Boot connaît la base ?

  • Autoconfiguration de SpringBoot
  • Fichier application.properties

                                #H2 Database configuration
                                database=h2
                                spring.datasource.schema=classpath*:schema.sql
                                spring.datasource.data=classpath*:data.sql
                        

Doc officielle

🍃Hands-on 5 : un webservice CRUD

  1. Transformer la classe Book en Entity
  2. Créez une classe BookReposiory qui implémente CrudRepository
  3. Book service implémente un CRUD
  4. BookController implémente les bons endpoints
  5. Utilisez une base h2 pour stockez vos données
  6. Quand vous avez terminé transformer la base h2 en base postgres contenu dans un container
  7. Dockerisez votre application