[JAVA] Points de révision du code de l'application Spring Boot

J'ai plus d'occasions de toucher Spring Boot au travail. Spring peut créer des applications avec une productivité assez élevée en utilisant pleinement les annotations et les fonctions associées, mais de nombreuses parties entraînent un comportement involontaire lorsqu'elles sont utilisées «d'une manière ou d'une autre». Cette fois, j'aimerais trier le contenu que je commente souvent lors des revues de code (même si ce n'est qu'un point rudimentaire ...).

(1) Est-il divisé en contrôleur / service / référentiel?

Dans Spring, il est recommandé de diviser le traitement de l'ensemble de l'application dans les classes de structure à trois couches suivantes au lieu de les écrire dans une classe spécifique.

couche Aperçu
Controller Classe pour être le point de contact pour les demandes
Service Classe qui implémente la logique métier
Repository Classe pour la persistance des données

Puisque ** Controller ** est le point d'entrée des requêtes, je pense que les développeurs qui sont nouveaux sur Spring le connaîtront, mais si vous créez une application sans penser à rien, vous vous retrouverez avec ** Controller **. Il est facile d'implémenter la logique métier dans **. Ensuite, ** un Fat Controller avec une faible maintenabilité et lisibilité ** sera créé, donc je pense que c'est un point d'être fortement conscient de l'isolement de la logique métier.

Personnellement, je pense qu'il est préférable de se concentrer sur les contenus suivants. L'idée est.

Lors de l'appel de plusieurs types de services dans un contrôleur, le contrôleur a tendance à être volumineux, donc dans ce cas, je pense qu'il est correct de créer une classe ServiceFacade qui sert d'intermédiaire entre le contrôleur et le service.

(2) L'implémentation tient-elle compte du cycle de vie de l'instance?

L'instance gérée par le conteneur DI de Spring est ** Singleton ** par défaut. En d'autres termes, si une variable membre a un état, l'état (ID utilisateur, etc.) sera mélangé parmi les utilisateurs accédant à la même application, et le comportement prévu ne sera souvent pas atteint. Fondamentalement, il est préférable de le rendre sans état, mais en fonction de vos besoins, envisagez de passer à une autre portée prise en charge par Spring.

portée intervalle
Singleton Un dans l'application
session Un par session
prototype Un pour chaque accès

En passant, s'il s'agit de votre propre classe, vous pouvez modifier la portée en ajoutant l'annotation @Scope.

@Scope("prototype")
@Service
public class SecretService {
 //Mise en œuvre du traitement
}

Comme point de vue de contrôle

Le point est autour.

(3) Utilisez-vous l'injection de constructeur?

L'injection de dépendances (DI) est inévitable lors de l'utilisation de Spring, mais il existe les deux méthodes suivantes si vous n'écrivez pas de fichier de paramètres. * Je pense que la définition en XML est toujours vivante, mais je pense que peu de gens l'utilisent, donc je vais l'omettre.

L'injection de champ est facile car vous ajoutez simplement @Autowired à la variable membre.

@Autowired
private SecretService service;

Cependant, il est obsolète en raison des inconvénients suivants. * Je me souviens avoir émis un avertissement même au printemps.

Par conséquent, à moins de circonstances spéciales (telles que la nécessité d'une dépendance circulaire), utilisez l'injection de constructeur.

private final SecretService service

public MyClass(SecretService service) {
  this.service = service;
}

Si la définition du constructeur est compliquée, vous pouvez également utiliser Lombok.

@AllArgsConstructor
public class MyClass {
  //TODO:la mise en oeuvre
}

(4) Y a-t-il un traitement qui peut être partagé?

Spring fournit HandlerInterceptor et AOP comme mécanisme pour définir le traitement commun transversal. En utilisant ces mécanismes

--Effectuer un prétraitement commun pour toutes les méthodes de toutes les classes sous un package spécifique

Dans certains cas, vous n'avez pas à implémenter le traitement en double. Y a-t-il beaucoup de ** sortie de journal ** comme cas courant?

  /**
   *Classe enregistreur
   */
  private final Logger logger = LoggerFactory.getLogger(MyController.class);
  
   
  /**
   *Demander un échantillon de méthode.
   * @param form Form classe
   * @param bindingResult Résultat de la validation
   * @réponse de retour
   */
  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String handleRequest(@Valid MyControllerForm form, BindingResult bindingResult) {
    logger.info("Test d'intercepteur");
    //réduction
  }
}

Plus précisément

@Aspect
@Component
public class MyInterceptor {

  @Before("execution(* jp.co.cross_xross.controller..*.*(..))")
  public void beforeProcess(JoinPoint joinPoint) throws Throwable {
    //Prétraitement
  }
}

Vous pouvez exécuter le "prétraitement", le "post-traitement" et le "traitement alternatif" en spécifiant le nom du package, le nom de la méthode, l'argument et la valeur de retour comme dans.

(5) Avez-vous implémenté vous-même les fonctions fournies par Spring?

Le matériel est bientôt épuisé (rires) Spring fournit des fonctions qui sont souvent implémentées sous forme de sous-projets. Je pense qu'il est préférable d'utiliser la partie qui a tendance à être difficile à mettre en œuvre par vous-même car elle peut être facilement réalisée en utilisant cette fonction.

Nom du sous-projet Fonctions fournies Remarques
Spring Session Réplication de session -
Spring Security Fonction d'authentification -
Spring Data Les données(RDBMS/KVS)opération -
Spring Social SNS(Facebook/Twitter/LinkedIn)La coopération その他SNSとのLa coopérationも可能
Spring Batch Le traitement par lots -
Spring AMQP Coopération Rabbit MQ -

Postface ...

Je voudrais le confirmer avec les points de révision de code de base de Java. Du point de vue de la révision du code Java pur, je me réfère aux articles de seniors écrits en qiita dans le passé.

Recommended Posts

Points de révision du code de l'application Spring Boot
Points de révision du code
Disponibilité de l'application Spring Boot 2.3
[Spring Boot] Création d'applications Web
Application Java CICS-Run - (4) Application Spring Boot
Développement d'applications Spring Boot dans Eclipse
Écrire du code de test avec Spring Boot
Programmation Spring Boot avec VS Code
Créer une application d'enquête avec Spring Boot
Implémenter l'application Spring Boot dans Gradle
Traitement lors du démarrage d'une application avec Spring Boot
Essayez d'utiliser Spring Boot avec VS Code
Démarrez le développement d'applications Web avec Spring Boot
Lancez l'application Nginx + Spring Boot avec docker-compose
Exécutez l'application WEB avec Spring Boot + Thymeleaf
Développement d'applications Web Spring Boot2 avec connexion Visual Studio Code SQL Server
Défi Spring Boot
Développement d'applications Web Spring Boot2 avec création de Visual Studio Code Hello World
Forme de botte de printemps
Spring Boot Rappelez-vous
gae + botte à ressort
Configurer l'application Spring Boot avec le module multiple maven
Exécuter un projet Spring Boot avec VS Code
Créez une application Spring Boot à l'aide d'IntelliJ IDEA
Déployer l'application Spring Boot sur Elastic Beanstalk
Créer un environnement Spring Boot avec Windows + VS Code
De la création d'un projet Spring Boot à l'exécution d'une application avec VS Code
Intégration Tomcat, Apache et WebSocket intégrée à l'application Spring Boot
Fiche d'apprentissage SPRING BOOT 01
Botte de printemps + Heroku Postgres
Ce à quoi j'étais accro lors du développement d'une application Spring Boot avec VS Code
Rédaction de mémo de démarrage de printemps (1)
Essayez d'utiliser OpenID Connect avec Keycloak (application Spring Boot)
Première botte à ressort (DI)
Fiche d'apprentissage SPRING BOOT 02
Aide-mémoire Spring Boot2
Spring Boot avec les paramètres du filtre de sécurité Spring et les points addictifs
Gestion des exceptions Spring Boot
[Spring boot] J'ai pensé au code testable par DI
Mappage du servlet Spring Boot
Environnement de développement-développement Spring Boot-
Procédure d'apprentissage Spring Boot
Apprentissage de Spring Boot [Début]
Rédaction de mémos de démarrage de printemps (2)
Résumé du document Spring Boot 2.2
[Spring Boot] DataSourceProperties $ DataSourceBeanCreationException
Tutoriels Spring Boot Sujets
Télécharger avec Spring Boot
Content-Type: application / json n'a pas charset = UTF-8 de Spring Boot 2.2
Implémenter l'API REST avec Spring Boot et JPA (Application Layer)
[Java] Déployer l'application Spring Boot sur Azure App Service
Déployez l'application créée par Spring Boot sur Heroku (public) ②
Exemple d'application Web qui gère plusieurs bases de données avec Spring Boot 1.5
Essayez d'utiliser l'API de recherche de code postal avec Spring Boot
Déployez l'application créée par Spring Boot sur Heroku (public) ①
Application Spring Boot qui spécifie les paramètres de connexion à la base de données avec des paramètres
[Spring Boot] Construction de l'environnement (macOS)
Définir le paramètre contextuel dans Spring Boot
Essayez Spring Boot de 0 à 100.
Générer un code à barres avec Spring Boot