Heim  >  Artikel  >  Java  >  Warum ich eine leichte Mini-Feder-Alternative entwickelt habe und wie ich sie gemacht habe

Warum ich eine leichte Mini-Feder-Alternative entwickelt habe und wie ich sie gemacht habe

WBOY
WBOYOriginal
2024-08-14 10:33:20543Durchsuche

In diesem kleinen Artikel werde ich versuchen zu erklären, warum ich diese Bibliothek erstellt habe? und wie wird es umgesetzt?

Warum habe ich diese Bibliothek erstellt?

Ich habe bei vielen Projekten mit dem Java EE-Framework gearbeitet und in den meisten davon gab es keine Begrenzung der verfügbaren Ressourcen zum Ausführen der Anwendung, aber in einigen seltenen Fällen hatten wir begrenzte Ressourcen, insbesondere den Speicher, um die Anwendung auf einem Bereitstellungsdienst bereitzustellen Wenn also die Anwendung das Limit überschreitet, verlangsamt der Bereitstellungsdienst die Anwendung zunächst. Wenn sie dann fortgesetzt wird, wird sie vom Dienst heruntergefahren. Wir verwendeten das Legacy-Spring-Framework ohne Spring-Boot, wir versuchten, eine andere Bibliothek zu verwenden, aber der Unterschied war minimal und wertlos, und hier entstand die Idee, eine leichte Spring-Alternative zu schaffen, die sich darauf konzentriert, den Speicherverbrauch so weit wie möglich zu reduzieren .

Als ich mit der Gestaltung der Bibliothek begann, hatte ich nur zwei Ziele im Kopf:
1 – Reduzieren Sie den Speicherverbrauch so weit wie möglich
2 – Versuchen Sie, die vorhandene Java EE-API so weit wie möglich zu nutzen, um den Übergang zur Bibliothek aus Lernsicht und aufgrund der Komplexität des Übergangs an sich einfach zu gestalten.
und mit diesen beiden Zielen ist es mir gelungen, den Speicherbedarf einer meiner Anwendungen um rund 40 % zu reduzieren und den Übergang einfach und schnell zu gestalten, da er den bestehenden Lösungen ähnelt.

Wie habe ich diese Bibliothek erstellt?

Hier ist das GitHub-Repository, damit Sie den Code beim Lesen überprüfen können.

Die Bibliothek als Ganzes besteht aus vielen Teilen (Screenshot unten), der größte Teil der Implementierung befindet sich im Hauptmodul, das auch in drei Arten unabhängiger Module unterteilt ist: Core, JPA, Web. Die App-Module dienen hauptsächlich der Integration, das Plugin-Modul ist ein Maven-Plugin, das dabei hilft, die notwendigen Dateien im Paketarchiv zu erstellen, damit die Bibliothek ordnungsgemäß funktioniert

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

Kernmodul

Also beginnen wir mit dem Kernmodul, das, wie der Name schon sagt, die Kernfunktionalität der Bibliothek enthält, nämlich die Abhängigkeitsinjektion oder die Umkehrung der Kontrolle.
Um diese Funktionalität zu erreichen, wird zunächst während der Kompilierungsphase der Klassenpfad der Anwendung nach allen annotierten Klassen durchsucht, die die Bibliothek verwalten sollte, um Komponentendefinitionen für annotierte Klassen zu erstellen.

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 Komponentendefinition enthält im Grunde alle Informationen, die wir später benötigen, um ein Objekt aus dieser Klasse zu instanziieren, wie z. B. die Konstruktorinformationen, wenn es einige Setter mit Injektionsannotation gibt (nur Konstruktor- und Setter-Injektion werden unterstützt), wenn die Klasse dies hat B. eine Schnittstelle oder eine andere Klasse erweitern, verfügen wir über alle Informationen, die wir benötigen, um ein Objekt aus dieser Klasse zu erstellen (Screenshot unten).
Und nachdem wir alle Klassenpfadanmerkungen gescannt und alle benötigten Komponentendefinitionen erstellt haben, speichern wir sie im Klassenpfad als JSON-Datei.

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

Die zweite und wichtigste Funktionalität des Kernmoduls ist die Abhängigkeitsinjektion und Umkehrung der Steuerung, die auf dem Factory-Design-Muster basiert. Wir haben also die ApplicationContext-Schnittstelle, die in sich selbst die ComponentFactory Schnittstelle und die Hauptmethode dieser Schnittstelle ist die Methode getComponent, die das Objekt aus dem Namen der Komponente zurückgibt.

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

Wie Sie im Screenshot oben sehen können, versuchen wir zunächst zu überprüfen, ob die Komponente in den bereits initialisierten Singleton-Komponenten vorhanden ist. Ist dies nicht der Fall, rufen wir zunächst die Komponentendefinition aus der JSON-Datei ab und starten dann die While-Schleife Rufen Sie alle Abhängigkeiten der Komponente ab, bevor Sie die Komponentendefinition und ihre Abhängigkeiten an den Komponentenassembler übergeben, um ein vollständiges Objekt für die Injektion bereitzustellen.

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 zu JPA wollte Die Bibliothek sollte reibungslos funktionieren und möglichst wenig Arbeit erfordern, daher war die Implementierung meiner eigenen Mini-Spring-Datenversion 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 bereitstellen, die diese Schnittstelle verwalten soll Es ist die 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

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

Webmodul

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 sehr ähnlich bekannte Java EE-Bibliothek wie Spring Web oder Jax-rs.

Die Implementierung basiert auf Annotation. Sie haben Klassen, die mit der Annotation Controller annotiert sind, und in diesem Controller finden Sie Methoden, die mit PathMapping annotiert sind, und diese Methoden behandeln bestimmte Pfade oder spezifische Anfrage basierend auf einigen Kriterien wie der Art der Anfrage, dem Inhaltstyp ...

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

Von außen sieht es der anderen Bibliothek sehr ähnlich, aber von innen ist es anders, da die Bibliothek diese Controller-Klassen zur Laufzeit ändert, damit sie alle das BaseHttpServlet erweitern , wodurch auch das HttpServlet erweitert wird und sie als normales Servlet funktionieren.

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

Wie Sie im Screenshot oben sehen können, initialisieren wir zuerst die Komponente in der Methode init, um alle Abhängigkeiten mithilfe des WebApplicationContext einzufügen, und dann bearbeiten wir alle Anfragen Wenn wir mit der Methode handleRequest auf diesen Controller zugreifen, verwenden wir bei diesem Ansatz die vorhandene Servlet-API zur Verwaltung der Controller. Dies trägt dazu bei, den Speicherbedarf gering zu halten und auch den Overhead zu reduzieren, da die Bibliothek als Plugin fungiert um die Servlet-API-Arbeit 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 der Anfrage abrufen Parameter oder Header oder Pfadvariable oder der Hauptteil der Anfrage...

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

Nous convertissons toutes ces informations puis les injectons en tant que paramètre dans la méthode lorsqu'elle est demandée, puis nous exécutons la méthode et convertissons le résultat ou le résultat en fonction du PathMapping produit ou du type de contenu (par par défaut c'est application/Json) puis nous écrivons le contenu dans HttpServletResponse.

Enfin, si quelque chose ne va pas dans le processus et qu'une erreur est générée, nous captons cette erreur ou l'exception et nous essayons de la gérer en fonction du type de l'exception, nous avons un gestionnaire d'exception pour gérer différents types d'exception et le l'utilisateur peut également fournir plus de gestionnaire pour gérer toute exception comme il le souhaite.

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

Plugin Maven

La dernière et importante partie est le plugin maven qui créera tous les fichiers nécessaires au bon fonctionnement de l'application et également à la construction du package jar ou war.
Tout d'abord, le plugin analysera le chemin de classe et les dépendances pour rechercher les fichiers component-definitions-json, à partir de ces fichiers, il générera :
lazy-application.json : contient tous les composants et leurs dépendances pour l'application

lazy-application.properties : contient la liste des contrôleurs et des entités afin que nous n'ayons pas besoin d'analyser le chemin de classe au moment de l'exécution.
et enfin si l'emballage est en pot, nous obtiendrons la classe principale.

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

et enfin, nous construisons le fichier d'archive du package qui contiendra le code de l'application avec ses dépendances et les fichiers que nous avons générés à l'étape précédente.

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

J'ai essayé de ne pas entrer dans les détails pour garder les articles courts et pas si compliqués à comprendre, bien sûr, le code est disponible sur GitHub afin que vous puissiez également jouer avec. Si vous avez des questions, déposez-les ci-dessous et j'essaierai pour y répondre.

Das obige ist der detaillierte Inhalt vonWarum ich eine leichte Mini-Feder-Alternative entwickelt habe und wie ich sie gemacht habe. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn