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 ...).
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.
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.
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
}
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.
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 | - |
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