„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > 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

Veröffentlicht am 26.08.2024
Durchsuche:216

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 verwenden, 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 etwa 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 Fabrikentwurfsmuster basiert. Wir haben also die Schnittstelle ApplicationContext, 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, wollte ich den Übergang zu 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 Alle finden 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 Transactional 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 und wie üblich in der Verwendung einigen sehr ähnlich ist 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 der Annotation PathMapping annotiert sind, und diese Methoden behandeln bestimmte Pfade oder bestimmte 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 reguläres 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 einzuschleusen, und dann werden wir alle Anfragen bearbeiten 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

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 PathMapping erzeugt oder den Inhaltstyp (von Standardmäßig ist es application/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 dem Typ der Ausnahme zu behandeln. Wir haben einen Ausnahmehandler, um verschiedene Arten von Ausnahmen zu behandeln Der Benutzer kann auch mehr Handler bereitstellen, 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 generiert es:
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 es versuchen um sie zu beantworten.

Freigabeerklärung Dieser Artikel ist abgedruckt unter: https://dev.to/7oukiw7rairi/why-i-created-a-lightweight-mini-spring-alternative-and-how-i-did-it-1a93?1 Falls ein Verstoß vorliegt Bitte kontaktieren Sie Study_golang @163.comdelete
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3