Maison > Java > javaDidacticiel > le corps du texte

Pourquoi j'ai créé une alternative légère aux mini-ressorts et comment je l'ai fait

WBOY
Libérer: 2024-08-14 10:33:20
original
589 Les gens l'ont consulté

Dans ce petit article je vais essayer d'expliquer pourquoi j'ai créé cette bibliothèque ? et comment c'est mis en œuvre ?

pourquoi j'ai créé cette bibliothèque ?

J'ai travaillé avec le framework Java EE sur de nombreux projets et dans la plupart d'entre eux, il n'y avait aucune limitation sur les ressources disponibles pour exécuter l'application mais dans de rares cas, nous avions des ressources limitées, notamment la mémoire pour déployer l'application sur un service de déploiement, donc lorsque l'application dépasse la limite, le service de déploiement ralentira d'abord l'application, puis s'il continue, le service l'arrêtera. Nous utilisions l'ancien framework Spring sans même Spring Boot, nous avons essayé d'utiliser une bibliothèque différente mais la différence était minime et sans valeur, et c'est là que l'idée de créer une alternative Spring légère axée sur la réduction autant que possible de la consommation de mémoire a commencé. .

Je n'avais que deux objectifs en tête lorsque j'ai commencé à concevoir la bibliothèque :
1 - réduire au maximum la consommation de mémoire
2 - essayez d'utiliser autant que possible l'API Java EE existante pour faciliter la transition vers la bibliothèque du point de vue de l'apprentissage et de la complexité de la transition en elle-même.
et avec ces 2 objectifs j'ai réussi à réduire l'empreinte mémoire d'une de mes applications d'environ 40% et à rendre la transition facile et rapide puisqu'elle est similaire aux solutions existantes.

Comment j'ai créé cette bibliothèque ?

Voici le référentiel GitHub pour que vous puissiez vérifier le code pendant la lecture.

La bibliothèque dans son ensemble comporte de nombreuses parties (capture d'écran ci-dessous), la majeure partie de l'implémentation dans le module principal qui est également divisée en trois types de modules indépendants : Core, JPA, Web. Les modules App sont principalement destinés à l'intégration, le module Plugin est un plugin Maven pour aider à créer les fichiers nécessaires dans l'archive du package pour que la bibliothèque fonctionne correctement

Why i created a lightweight mini spring alternative and how I did it

Module de base

Nous allons donc commencer par le module principal qui comme son nom l'indique contient la fonctionnalité principale de la bibliothèque qui est l'injection de dépendances ou l'inversion de contrôle.
Afin d'obtenir cette fonctionnalité, il faut d'abord analyser le chemin de classe de l'application pendant la phase de compilation pour toutes les classes annotées que la bibliothèque doit gérer pour créer des définitions de composants pour les classes annotées.

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

La définition du composant contient essentiellement toutes les informations dont nous aurons besoin pour instancier un objet de cette classe plus tard, comme les informations du constructeur, s'il existe des setters avec une annotation inject (seules les injections de constructeur et de setter sont prises en charge) si la classe a une interface ou étendre une autre classe, nous aurons toutes les informations dont nous avons besoin pour créer un objet à partir de cette classe (capture d'écran ci-dessous).
Et puis, après avoir analysé toutes les annotations du chemin de classe et créé toutes les définitions de composants dont nous avons besoin, nous les stockerons dans le chemin de classe sous forme de fichier JSON.

Why i created a lightweight mini spring alternative and how I did it

La deuxième et principale fonctionnalité du module principal est l'injection de dépendances et l'inversion du contrôle qui sont basées sur le modèle de conception d'usine. Nous avons donc l'interface ApplicationContext qui en elle-même étend l'interface ComponentFactory et la méthode principale de cette interface est Méthode getComponent qui renverra l'objet à partir du nom du composant.

Why i created a lightweight mini spring alternative and how I did it

Comme vous pouvez le voir dans la capture d'écran ci-dessus, nous essayons d'abord de vérifier si le composant existe dans les composants Singleton déjà initialisés, si ce n'est pas le cas alors nous commençons par récupérer la définition du composant à partir du fichier JSON puis nous démarrons la boucle while pour tout obtenir. les dépendances du composant avant de transmettre la définition du composant et ses dépendances à l'assembleur du composant pour obtenir un objet complet prêt à être injecté.

Why i created a lightweight mini spring alternative and how I did it

JPA-Modul

Die Implementierung des JPA-Moduls ist der von Spring Data JPA sehr ähnlich, aber sehr minimal. Der Grund dafür ist, dass es sehr ähnlich ist, weil ich Spring Data in vielen Projekten verwendet habe und es einfach zu verwenden fand und wie ich bereits sagte, ich den Übergang zur Bibliothek wollte reibungslos sein und so wenig Arbeit wie möglich erfordern, daher war die Implementierung meiner eigenen Mini-Federdatenversion die beste Wahl.

Die Implementierung basiert auf der JpaRepository-Schnittstelle, die die häufigsten Vorgänge für Datenbanken wie Speichern, Löschen und FindAll enthält. Um das JPA-Modul verwenden zu können, müssen Sie diese Schnittstelle erweitern und die Entität angeben, die diese Schnittstelle verwalten soll, sowie deren ID Nachdem Sie die Schnittstelle erweitert und mit Repository-Annotation annotiert haben, können Sie Ihre Methoden definieren und sie mit Query-Annotation annotieren und die JPQL-Abfrage bereitstellen. Anschließend erstellt die Bibliothek in der Kompilierungsphase eine voll funktionsfähige Klasse, die diese Schnittstelle implementiert.

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Die Bibliothek verwaltet auch den Transaktionsteil der Anwendung, sodass alle Repository-Schnittstellen und alle mit Transaktionsannotationen versehenen Klassen von der Bibliothek aus Transaktionssicht verwaltet werden. Daher erstellt die Bibliothek für jede Transaktionskomponente einen Proxy, um die Transaktion basierend auf der Annotation „Transaktional“ zu verwalten, und verwaltet auch den Lebenszyklus des Entitätsmanagers

Why i created a lightweight mini spring alternative and how I did it

Webmodul Why i created a lightweight mini spring alternative and how I did it

Das Webmodell ist für die Verwaltung des gesamten Webteils der Anwendung verantwortlich und ist von Natur aus ein unabhängiges Modul, was bedeutet, dass es unabhängig von den übrigen Modulen in der Bibliothek verwendet werden kann. Wie üblich ist es in der Verwendung einigen bekannten Java-Modulen sehr ähnlich EE-Bibliothek wie Spring Web oder Jax-rs.

Die Implementierung basiert auf Annotationen. Sie haben Klassen, die mit

Controller

-Annotationen annotiert sind, und in diesem Controller finden Sie Methoden, die mit

PathMapping annotiert sind. Diese Methoden verarbeiten bestimmte Pfade oder spezifische Anforderungen basierend auf einigen Kriterien wie dem Typ der Anfrage, der Inhaltstyp...

Why i created a lightweight mini spring alternative and how I did it

Von außen sieht es der anderen Bibliothek sehr ähnlich, aber von innen ist es anders, da die Bibliothek diese Why i created a lightweight mini spring alternative and how I did itController

-Klassen zur Laufzeit ändert, sodass sie alle das

BaseHttpServlet erweitern, was auch das HttpServlet erweitert und sie funktionieren wie ein normales Servlet.

Wie Sie im Screenshot oben sehen können, initialisieren wir zunächst die Komponente in der Methode Why i created a lightweight mini spring alternative and how I did itinit

, um alle Abhängigkeiten mithilfe des

WebApplicationContext einzuschleusen, und dann verarbeiten wir alle an diesen Controller eingehenden Anforderungen mithilfe der Methode handleRequest Bei diesem Ansatz werden wir die vorhandene Servlet-API zur Verwaltung der Controller verwenden. Dies wird dazu beitragen, den Speicherbedarf gering zu halten und auch den Overhead zu reduzieren, da die Bibliothek als Plugin fungiert, um die Arbeit der Servlet-API zu ergänzen. Zuerst versuchen wir, die Anfrage der richtigen Methode zuzuordnen und danach versuchen wir, alle angeforderten Informationen in die Methode einzufügen, indem wir die Informationen entweder aus dem Kontext oder aus der HttpServletRequest

wie dem Anfrageparameter oder den Headern oder der Pfadvariablen abrufen oder der Hauptteil der Anfrage...

Why i created a lightweight mini spring alternative and how I did it

Wir konvertieren alle diese Informationen und fügen sie dann als Parameter in die Methode ein, wenn sie angefordert wird. Anschließend führen wir die Methode aus und konvertieren das Ergebnis oder das Ergebnis basierend auf dem von PathMapping erzeugten Inhaltstyp (standardmäßig ist es Anwendung/Json). und dann schreiben wir den Inhalt in die HttpServletResponse.

Wenn im Prozess etwas schief geht und ein Fehler ausgelöst wird, fangen wir diesen Fehler oder die Ausnahme ab und versuchen, ihn basierend auf der Art der Ausnahme zu behandeln. Wir haben einen Ausnahmehandler, um verschiedene Arten von Ausnahmen zu behandeln, und der Benutzer kann dies tun Stellen Sie außerdem mehr Handler bereit, um jede Ausnahme nach seinen Wünschen zu behandeln.

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Maven-Plugin

Der letzte und wichtige Teil ist das Maven-Plugin, das alle notwendigen Dateien erstellt, damit die Anwendung ordnungsgemäß funktioniert und auch das JAR- oder War-Paket erstellt.
Zuerst scannt das Plugin den Klassenpfad und die Abhängigkeiten, um nach component-definitions-json-Dateien zu suchen. Aus diesen Dateien wird Folgendes generiert:
lazy-application.json: enthält alle Komponenten und ihre Abhängigkeiten für die Anwendung

lazy-application.properties: enthält die Liste der Controller und Entitäten, sodass wir den Klassenpfad zur Laufzeit nicht scannen müssen.
und zuletzt, wenn die Verpackung ein Glas ist, erhalten wir die Hauptklasse.

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Und zuletzt erstellen wir die Paketarchivdatei, die den Anwendungscode mit seinen Abhängigkeiten und die Dateien enthält, die wir im vorherigen Schritt generiert haben.

Why i created a lightweight mini spring alternative and how I did it

Why i created a lightweight mini spring alternative and how I did it

Ich habe versucht, nicht ins Detail zu gehen, um die Artikel kurz zu halten und nicht so kompliziert zu verstehen. Natürlich ist der Code auf GitHub verfügbar, sodass Sie auch damit spielen können. Wenn Sie Fragen haben, schreiben Sie sie unten und ich werde versuchen, sie zu beantworten sie.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal