[JAVA] Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot

introduction

Ceci est un article de Your Meister Advent Calendar 2019 Day 13. (Ce sera un article qui sort ce que vous avez appris depuis que vous êtes devenu membre de la société.)

Contexte de cette époque

Après être devenu membre de la société, j'ai appris le concept de DI (injection de dépendance). Il y a eu de nombreuses occasions où j'ai utilisé le framework lors du développement de services WEB, mais je me souviens que le concept de DI n'apparaissait pas dans le Cake PHP que j'utilisais principalement. (Je suis désolé si j'ai une mauvaise mémoire.)

DI utilise une instance pré-enregistrée en utilisant ce qu'on appelle un conteneur DI ou un conteneur de service (appelé conteneur DI dans Spring Boot et un conteneur de service dans Laravel) au lieu de créer une instance avec new et de l'utiliser. Faire.

Cette fois, j'aimerais écrire un article sur le thème de l'utilisation des conteneurs DI dans Spring Boot, que j'utilise pour les entreprises, et de l'utilisation des conteneurs de services dans Laravel, que j'ai récemment appris par moi-même.

Pour Spring Boot

Utiliser l'injection de constructeur

J'écrirai en utilisant le code que j'ai écrit dans l'article le 7ème jour de Your Meister Advent Calendar 2019. Essayez de changer de base de données dynamiquement avec Spring Boot https://github.com/Masaki-Ogawa/datasourceDemo

  1. PersonRepository.java

PersonRepository.java


package com.example.dataSourceDemo.domain.repositories;

import com.example.dataSourceDemo.domain.models.Person;
import org.springframework.data.jpa.repository.JpaRepository;

@Repository
public interface PersonRepository extends JpaRepository<Person, Integer> {

}

Classe de référentiel qui hérite de JpaRepository

  1. PersonServiceImpl.java

PersonServiceImpl.java


package com.example.dataSourceDemo.domain.services;

import com.example.dataSourceDemo.annotations.DataSource;
import com.example.dataSourceDemo.annotations.DataSource.DataSourceType;
import com.example.dataSourceDemo.domain.models.Person;
import com.example.dataSourceDemo.domain.repositories.PersonRepository;
import java.util.List;
import org.springframework.stereotype.Service;

@Service
public class PersonServiceImpl implements PersonService {

  private final PersonRepository personRepository;

  public PersonServiceImpl(
      PersonRepository personRepository) {
    this.personRepository = personRepository;
  }

  /**
   *Méthode pour obtenir l'enregistrement de la table Person à partir de DB de stg
   * @enregistrement dans la table des personnes de retour
   */
  @Override
  public List<Person> findAllPersonInStg() {
    return personRepository.findAll();
  }

  /**
   *Méthode pour obtenir l'enregistrement de la table Person à partir de DB de stg
   * @enregistrement dans la table des personnes de retour
   */
  @DataSource(value = DataSourceType.PROD)
  @Override
  public List<Person> findAllPersonInProd() {
    return personRepository.findAll();
  }
}

Je fais de la DI ici.

En particulier,


private final PersonRepository personRepository;

  public PersonServiceImpl(
      PersonRepository personRepository) {
    this.personRepository = personRepository;
  }

L'injection DI par constructeur est effectuée dans la partie de. Il est enregistré dans le conteneur DI en utilisant les annotations «@ Service» et «@ Repository». Pour l'utiliser, créez une instance à l'aide de l'injection de constructeur, etc. comme décrit ci-dessus.

référence Spring Framework Summary-About DI

DI à Laravel

Utilisez un fournisseur de services

Créez un fournisseur de services pour enregistrer le service créé en tant que conteneur de services. Cette fois, j'ai créé une classe de service appelée DemoService.

AppServiceProvider.php


class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register()
    {
        $this->app->bind('App\Services\DemoService');
    }

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        //
    }
}

Enregistrez le service comme ci-dessus.

DemoService.php


class DemoService {
    public function show() {
        echo "Montre quelque chose";
    }
}

La classe de service convient cette fois, mais seule la méthode qui produit certains caractères est implémentée.

DemoController.php


class MessageController extends Controller
{
    protected $demoService;

    public function __construct(DemoService $demoService)
    {
        $this->demoService = $demoService;
    }

    public function index(Request $request) {

        return $this->demoService->show();
    }
}

De cette façon, nous utilisons également l'injection de constructeur pour faire DI.

À la fin

Personnellement, je pense que Spring Boot, qui peut être enregistré dans le conteneur DI avec des annotations telles que @ Service et @ Controller, est plus facile à utiliser. Après tout, en utilisant Java et Spring Boot, il existe de nombreuses situations dans lesquelles la puissance des annotations est remarquée.

Aussi, comme je l'ai écrit dans le Calendrier de l'Avent le 7ème jour, chaque cadre a ses avantages et ses inconvénients, et l'expérience de toucher de nombreux cadres est que lorsque je fais quelque chose dans le futur, "Quel genre de chose dois-je adopter?" Si oui, est-ce le meilleur pour le produit? "

À l'avenir, j'aimerais continuer à aborder à la fois les entreprises et les non-entreprises.

Recommended Posts

Essayez d'utiliser un conteneur DI avec Laravel et Spring Boot
Essayez d'utiliser Spring Boot avec VS Code
Essayez d'utiliser Spring Boot Security
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Partie 1: Essayez d'utiliser la connexion OAuth 2.0 prise en charge par Spring Security 5 avec Spring Boot
HTTPS avec Spring Boot et Let's Encrypt
Traitement asynchrone avec Spring Boot en utilisant @Async
Image de l'application Spring Boot à l'aide de jib-maven-plugin et lancez-la avec Docker
Essayez l'authentification LDAP avec Spring Security (Spring Boot) + OpenLDAP
Essayez d'implémenter la fonction de connexion avec Spring Boot
Essayez d'automatiser la migration avec Spring Boot Flyway
Essayez d'utiliser un autre conteneur de servlet Jetty avec Docker
Essayez DI avec Micronaut
Première botte à ressort (DI)
Télécharger avec Spring Boot
Essayez d'utiliser Spring JDBC
Test des entités et référentiels JPA à l'aide de Spring Boot @DataJpaTest
[Note] Fichier de configuration lors de l'utilisation de Logback avec Spring Boot
Changer d'environnement avec Spring Boot application.properties et l'annotation @Profile
Mémo d'utilisation de Spring Security: coopération avec Spring MVC et Boot
[Compatible JUnit 5] Ecrire un test en utilisant JUnit 5 avec Spring boot 2.2, 2.3
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
Essayez la loi de l'inversion des dépendances avec plusieurs projets Spring Boot
Testez la classe injectée sur le terrain dans le test de démarrage Spring sans utiliser le conteneur Spring
Tentative de SSR Vue.js avec Spring Boot et GraalJS
Essayez de travailler avec Keycloak en utilisant Spring Security SAML (Spring 5)
Connectez Spring Boot et Angular en toute sécurité avec OpenAPI Generator
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot
Hello World avec Spring Boot
Implémenter GraphQL avec Spring Boot
Essayez d'utiliser GloVe avec Deeplearning4j
Démarrez avec Spring Boot
Bonjour tout le monde avec Spring Boot!
Exécutez LIFF avec Spring Boot
Connexion SNS avec Spring Boot
Introduction à Spring Boot ① ~ DI ~
Téléchargement de fichiers avec Spring Boot
Spring Boot commençant par copie
Utilisation de Mapper avec Java (Spring)
Spring Boot à partir de Docker
Hello World avec Spring Boot
Définir des cookies avec Spring Boot
Utiliser Spring JDBC avec Spring Boot
Ajouter un module avec Spring Boot
Premiers pas avec Spring Boot
Essayez Spring Boot sur Mac
Créer un micro service avec Spring Boot
Envoyer du courrier avec Spring Boot
Gérez l'API de date et d'heure Java 8 avec Thymeleaf avec Spring Boot
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
Implémenter l'API REST avec Spring Boot et JPA (couche d'infrastructure)
Jusqu'à INSERT et SELECT sur Postgres avec botte de printemps et feuille de thym
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Obtenez des informations d'erreur à l'aide de DefaultErrorAttributes et ErrorAttributeOptions dans Spring Boot 2.3
Connectez-vous à la base de données avec spring boot + spring jpa et effectuez l'opération CRUD
Implémenter l'API REST avec Spring Boot et JPA (Domain Layer Edition)
Développement piloté par domaine avec Java et Spring Boot-Layer et division de modules
J'ai essayé de démarrer avec Swagger en utilisant Spring Boot