Heim Java javaLernprogramm 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

Aug 14, 2024 am 10:33 AM

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!

Erklärung dieser Website
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

Heiße KI -Werkzeuge

Undresser.AI Undress

Undresser.AI Undress

KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover

AI Clothes Remover

Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool

Undress AI Tool

Ausziehbilder kostenlos

Clothoff.io

Clothoff.io

KI-Kleiderentferner

Video Face Swap

Video Face Swap

Tauschen Sie Gesichter in jedem Video mühelos mit unserem völlig kostenlosen KI-Gesichtstausch-Tool aus!

Heißer Artikel

<🎜>: Bubble Gum Simulator Infinity - So erhalten und verwenden Sie Royal Keys
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Nordhold: Fusionssystem, erklärt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Mandragora: Flüstern des Hexenbaum
3 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌

Heiße Werkzeuge

Notepad++7.3.1

Notepad++7.3.1

Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version

SublimeText3 chinesische Version

Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1

Senden Sie Studio 13.0.1

Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6

Dreamweaver CS6

Visuelle Webentwicklungstools

SublimeText3 Mac-Version

SublimeText3 Mac-Version

Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Java-Tutorial
1670
14
PHP-Tutorial
1276
29
C#-Tutorial
1256
24
Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Verursacht die Sicherheitssoftware des Unternehmens, die die Anwendung nicht ausführt? Wie kann man es beheben und es lösen? Apr 19, 2025 pm 04:51 PM

Fehlerbehebung und Lösungen für die Sicherheitssoftware des Unternehmens, die dazu führt, dass einige Anwendungen nicht ordnungsgemäß funktionieren. Viele Unternehmen werden Sicherheitssoftware bereitstellen, um die interne Netzwerksicherheit zu gewährleisten. ...

Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Wie konvertiere ich Namen in Zahlen, um die Sortierung zu implementieren und die Konsistenz in Gruppen aufrechtzuerhalten? Apr 19, 2025 pm 11:30 PM

Lösungen zum Umwandeln von Namen in Zahlen zur Implementierung der Sortierung in vielen Anwendungsszenarien müssen Benutzer möglicherweise in Gruppen sortieren, insbesondere in einem ...

Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Wie vereinfachte ich Probleme mit der Feldzuordnung im Systemdocking mithilfe des Mapstruct? Apr 19, 2025 pm 06:21 PM

Die Verarbeitung von Feldzuordnungen im Systemdocken stößt häufig auf ein schwieriges Problem bei der Durchführung von Systemdocken: So kartieren Sie die Schnittstellenfelder des Systems und ...

Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Wie identifiziert Intellij IDEA die Portnummer eines Spring -Boot -Projekts, ohne ein Protokoll auszugeben? Apr 19, 2025 pm 11:45 PM

Beginnen Sie den Frühling mit der Intellijideaultimate -Version ...

Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Wie kann ich elegante Entitätsklassenvariablennamen erhalten, um Datenbankabfragebedingungen zu erstellen? Apr 19, 2025 pm 11:42 PM

Bei Verwendung von MyBatis-Plus oder anderen ORM-Frameworks für Datenbankvorgänge müssen häufig Abfragebedingungen basierend auf dem Attributnamen der Entitätsklasse erstellt werden. Wenn Sie jedes Mal manuell ...

Wie kann ich Java -Objekte sicher in Arrays umwandeln? Wie kann ich Java -Objekte sicher in Arrays umwandeln? Apr 19, 2025 pm 11:33 PM

Konvertierung von Java-Objekten und -Arrays: Eingehende Diskussion der Risiken und korrekten Methoden zur Konvertierung des Guss-Typs Viele Java-Anfänger werden auf die Umwandlung eines Objekts in ein Array stoßen ...

E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? E-Commerce-Plattform SKU und SPU-Datenbankdesign: Wie berücksichtigen Sie sowohl benutzerdefinierte Attribute als auch Attributloses Produkte? Apr 19, 2025 pm 11:27 PM

Detaillierte Erläuterung des Designs von SKU- und SPU-Tabellen auf E-Commerce-Plattformen In diesem Artikel werden die Datenbankdesignprobleme von SKU und SPU in E-Commerce-Plattformen erörtert, insbesondere wie man mit benutzerdefinierten Verkäufen umgeht ...

Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Wie verwendet ich die Redis -Cache -Lösung, um die Anforderungen der Produktranking -Liste effizient zu erkennen? Apr 19, 2025 pm 11:36 PM

Wie erkennt die Redis -Caching -Lösung die Anforderungen der Produktranking -Liste? Während des Entwicklungsprozesses müssen wir uns häufig mit den Anforderungen der Ranglisten befassen, z. B. das Anzeigen eines ...

See all articles