[JAVA] Überprüfungspunkte für den Spring Boot-Anwendungscode

Ich habe mehr Möglichkeiten, Spring Boot bei der Arbeit zu berühren. Spring kann Apps mit relativ hoher Produktivität erstellen, indem Anmerkungen und verwandte Funktionen vollständig genutzt werden. Es gibt jedoch viele Teile, die unbeabsichtigtes Verhalten verursachen, wenn sie "irgendwie" verwendet werden. Dieses Mal möchte ich den Inhalt sortieren, den ich bei Codeüberprüfungen oft kommentiere (obwohl dies nur ein rudimentärer Punkt ist ...).

(1) Ist es in Controller / Service / Repository unterteilt?

Im Frühjahr wird empfohlen, die Verarbeitung der gesamten Anwendung in die folgende dreischichtige Strukturklasse zu unterteilen, anstatt sie in eine bestimmte Klasse zu schreiben.

Schicht Überblick
Controller Klasse als Kontaktstelle für Anfragen
Service Klasse, die Geschäftslogik implementiert
Repository Klasse für Datenpersistenz

Da ** Controller ** der Einstiegspunkt für Anfragen ist, denke ich, dass Entwickler, die Spring noch nicht kennen, damit vertraut sind. Wenn Sie jedoch eine App erstellen, ohne an irgendetwas zu denken, erhalten Sie ** Controller **. Es ist einfach, Geschäftslogik in ** zu implementieren. Dann wird ein Fat Controller mit geringer Wartbarkeit und Lesbarkeit erstellt, daher ist es meines Erachtens wichtig, sich der Isolation der Geschäftslogik bewusst zu sein.

Persönlich denke ich, dass es am besten ist, sich auf die folgenden Inhalte zu konzentrieren. Die Idee ist.

Wenn mehrere Arten von Diensten in einem Controller aufgerufen werden, ist der Controller in der Regel groß. In diesem Fall halte ich es für in Ordnung, eine ServiceFacade-Klasse zu erstellen, die zwischen dem Controller und dem Dienst vermittelt.

(2) Berücksichtigt die Implementierung den Lebenszyklus der Instanz?

Die vom DI-Container von Spring verwaltete Instanz ist standardmäßig ** Singleton **. Mit anderen Worten, wenn eine Mitgliedsvariable einen Status hat, wird der Status (Benutzer-ID usw.) zwischen Benutzern gemischt, die auf dieselbe Anwendung zugreifen, und das beabsichtigte Verhalten wird häufig nicht erreicht. Grundsätzlich ist es besser, es zustandslos zu machen. Abhängig von Ihren Anforderungen sollten Sie jedoch in einen anderen Bereich wechseln, der von Spring unterstützt wird.

Umfang Reichweite
Singleton Eine in der Anwendung
session Eine pro Sitzung
prototype Eine für jeden Zugang

Wenn es sich um Ihre eigene Klasse handelt, können Sie den Bereich übrigens ändern, indem Sie die Annotation @Scope hinzufügen.

@Scope("prototype")
@Service
public class SecretService {
 //Implementierung der Verarbeitung
}

Zur Kontrolle

Der Punkt ist herum.

(3) Verwenden Sie eine Konstruktorinjektion?

Die Abhängigkeitsinjektion (DI) ist bei Verwendung von Spring unvermeidbar. Wenn Sie jedoch keine Einstellungsdatei schreiben, gibt es die folgenden zwei Methoden. * Ich denke, dass die Definition in XML noch lebendig ist, aber ich denke, dass nur wenige Leute sie verwenden, also werde ich sie weglassen.

Die Feldinjektion ist einfach, da Sie der Mitgliedsvariablen einfach @Autowired hinzufügen.

@Autowired
private SecretService service;

Es wurde jedoch aufgrund der folgenden Nachteile abgelehnt. * Ich erinnere mich, dass ich sogar im Frühjahr eine Warnung ausgegeben habe.

Verwenden Sie daher, sofern keine besonderen Umstände vorliegen (z. B. die Notwendigkeit einer zirkulären Abhängigkeit), die Konstruktorinjektion.

private final SecretService service

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

Wenn die Definition des Konstruktors kompliziert ist, können Sie auch Lombok verwenden.

@AllArgsConstructor
public class MyClass {
  //TODO:Implementierung
}

(4) Gibt es eine Verarbeitung, die gemeinsam genutzt werden kann?

Spring bietet HandlerInterceptor und AOP als Mechanismus zum Definieren der übergreifenden allgemeinen Verarbeitung. Durch die Nutzung dieser Mechanismen

In einigen Fällen müssen Sie keine doppelte Verarbeitung implementieren. Gibt es eine Menge ** Protokollausgabe ** als häufigen Fall?

  /**
   *Logger-Klasse
   */
  private final Logger logger = LoggerFactory.getLogger(MyController.class);
  
   
  /**
   *Musterbeispiel anfordern.
   * @param form Formularklasse
   * @param bindingResult Validierungsergebnis
   * @Antwort zurückgeben
   */
  @RequestMapping(value = "/", method = RequestMethod.GET)
  public String handleRequest(@Valid MyControllerForm form, BindingResult bindingResult) {
    logger.info("Abfangtest");
    //Kürzung
  }
}

Speziell

@Aspect
@Component
public class MyInterceptor {

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

Sie können "Vorverarbeitung", "Nachbearbeitung" und "alternative Verarbeitung" ausführen, indem Sie den Paketnamen, den Methodennamen, das Argument und den Rückgabewert wie in angeben.

(5) Haben Sie die von Spring bereitgestellten Funktionen selbst implementiert?

Das Material ist fast erschöpft (lacht) Spring bietet Funktionen, die oft als Teilprojekte implementiert werden. Ich denke, dass es besser ist, den Teil zu verwenden, der für Sie schwierig zu implementieren ist, da er mit dieser Funktion leicht realisiert werden kann.

Name des Teilprojekts Bereitgestellte Funktionen Bemerkungen
Spring Session Sitzungsreplikation -
Spring Security Authentifizierungsfunktion -
Spring Data Daten(RDBMS/KVS)Operation -
Spring Social SNS(Facebook/Twitter/LinkedIn)Zusammenarbeit その他SNSとのZusammenarbeitも可能
Spring Batch Stapelverarbeitung -
Spring AMQP Kaninchen MQ Zusammenarbeit -

Nachwort ...

Ich möchte es zusammen mit den grundlegenden Codeüberprüfungspunkten von Java bestätigen. Aus der Perspektive der reinen Java-Codeüberprüfung verweise ich auf die Artikel von Senioren, die in der Vergangenheit in Qiita geschrieben wurden.

Recommended Posts

Überprüfungspunkte für den Spring Boot-Anwendungscode
Codeüberprüfungspunkte
Spring Boot 2.3 Verfügbarkeit von Anwendungen
[Spring Boot] Erstellung von Webanwendungen
CICS-Java-Anwendung ausführen- (4) Spring Boot-App
Spring Boot-Anwendungsentwicklung in Eclipse
Schreiben Sie den Testcode mit Spring Boot
Spring Boot Programmierung mit VS Code
Erstellen Sie eine Anfrage-App mit Spring Boot
Implementieren Sie die Spring Boot-Anwendung in Gradle
Verarbeitung beim Starten einer Anwendung mit Spring Boot
Versuchen Sie es mit Spring Boot mit VS-Code
Starten Sie die Entwicklung von Webanwendungen mit Spring Boot
Starten Sie die Nginx + Spring Boot-Anwendung mit Docker-Compose
Führen Sie die WEB-Anwendung mit Spring Boot + Thymeleaf aus
Spring Boot2-Webanwendungsentwicklung mit Visual Studio Code SQL Server-Verbindung
Fordern Sie Spring Boot heraus
Spring Boot2-Webanwendungsentwicklung mit Visual Studio Code Hello World-Erstellung
Spring Boot Form
Spring Boot Denken Sie daran
gae + frühlingsstiefel
Konfigurieren Sie die Spring Boot-Anwendung mit dem Maven Multi-Modul
Führen Sie ein Spring Boot-Projekt mit VS-Code aus
Erstellen Sie eine Spring Boot-Anwendung mit IntelliJ IDEA
Stellen Sie die Spring Boot-Anwendung für Elastic Beanstalk bereit
Erstellen Sie eine Spring Boot-Umgebung mit Windows + VS-Code
Vom Erstellen eines Spring Boot-Projekts bis zum Ausführen einer Anwendung mit VS Code
In die Spring Boot-Anwendung integrierte Integration von Tomcat, Apache und WebSocket
SPRING BOOT Lernaufzeichnung 01
Frühlingsstiefel + Heroku Postgres
Wovon ich süchtig war, als ich eine Spring Boot-Anwendung mit VS Code entwickelte
Schreiben von Frühlingsstiefel-Memos (1)
Versuchen Sie, OpenID Connect mit Keycloak (Spring Boot-Anwendung) zu verwenden.
Erster Frühlingsstiefel (DI)
SPRING BOOT Lernprotokoll 02
Spring Boot2 Spickzettel
Spring Boot mit Spring Security Filter-Einstellungen und Suchtpunkten
Spring Boot-Ausnahmebehandlung
[Spring Boot] Ich dachte über testbaren Code von DI nach
Spring Boot Servlet-Zuordnung
Spring Boot Entwicklung-Entwicklungsumgebung-
Spring Boot-Lernverfahren
Spring Boot lernen [Anfang]
Schreiben von Spring Boot-Memos (2)
Spring Boot 2.2 Dokumentzusammenfassung
[Spring Boot] DataSourceProperties $ DataSourceBeanCreationException
Spring Boot Tutorials Themen
Mit Spring Boot herunterladen
Inhaltstyp: application / json hat seit Spring Boot 2.2 keinen Zeichensatz = UTF-8
Implementieren Sie die REST-API mit Spring Boot und JPA (Application Layer).
[Java] Stellen Sie die Spring Boot-Anwendung für den Azure App Service bereit
Stellen Sie die von Spring Boot erstellte Anwendung für Heroku (öffentlich) bereit ②
Beispiel einer Webanwendung, die mit Spring Boot 1.5 mehrere Datenbanken verwaltet
Versuchen Sie, die Springcode-Such-API mit Spring Boot aufzurufen
Stellen Sie die von Spring Boot erstellte Anwendung für Heroku (öffentlich) bereit ①
Spring Boot-Anwendung, die DB-Verbindungseinstellungen mit Parametern angibt
[Spring Boot] Umgebungskonstruktion (macOS)
Legen Sie den Kontextparameter in Spring Boot fest
Versuchen Sie Spring Boot von 0 bis 100.
Generieren Sie mit Spring Boot einen Barcode