Heim Java javaLernprogramm Das Ausführungsproblem der setApplicationContext-Methode der applicationContextAware-Schnittstelle führte dazu, dass Spring Beans nicht abgerufen werden konnten

Das Ausführungsproblem der setApplicationContext-Methode der applicationContextAware-Schnittstelle führte dazu, dass Spring Beans nicht abgerufen werden konnten

Nov 23, 2024 am 07:53 AM

In diesem Artikel möchte ich ein Problem mitteilen, auf das ich kürzlich gestoßen bin und das meiner Meinung nach für Sie von Interesse sein könnte.

Was ist das Problem?

Der Quellcode für die Test- und Produktionsumgebung ist derselbe, und sowohl die lokale als auch die Testumgebung laufen gut. Nur die Produktionsumgebung, die mit einem NPE einer Serviceklasse ausgeführt wird, konnte nicht geladen werden, was die neuen Anforderungen betraf. Diese Klasse erbt die Schnittstelle vom Customize-Paket (einem selbst entwickelten Toolkit).

Die Projektstruktur

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

Das Design von Customize basiert auf Spring, um APIs und Dienste zu verwalten. Beim automatischen Spring-Scan werden die gemeinsamen Klassen ApiEnhancer und ServiceEnhancer beim Initialisieren der Klassen geladen und Instanzen über ApplicationContext abgerufen. Beim Debuggen wurde festgestellt, dass der ApplicationContext beim Laden null ist und noch nicht initialisiert wurde. Es wird in der setApplicationContext-Methode durch Implementierung von ApplicationContextAware initialisiert, daher wird spekuliert, dass die setApplicationContext-Methode nicht ausgeführt wurde.

Während des Ladevorgangs der ApplicationContextProvider-Klasse werden die statischen Methoden während der Initialisierungsphase in den Methodenbereich geladen. Wenn Sie jedoch ApplicationContext zum Abrufen von Bean-Instanzen verwenden, werden die statischen Methoden direkt über den Klassennamen aufgerufen. Solange die API erstellt wird, bevor dem ApplicationContextProvider Speicher im Heap zugewiesen und instanziiert wurde, wird die setApplicationContext-Methode nicht zur Initialisierung aufgerufen.

Der applicationContextProvider verwendet die Annotation @Component und die API verwendet die Annotation @RestController, und die beiden Klassen befinden sich im selben Pfad. Wenn Spring sie jedoch scannt und lädt, gibt es keine bestimmte Reihenfolge, was bedeutet, dass jede der beiden Klassen vor der anderen erstellt werden kann. In der Produktionsumgebung wird die API vor dem applicationContextProvider erstellt. Dies führt dazu, dass der applicationContext NICHT initialisiert wurde.

, wenn die statische Methode direkt über den Klassennamen aufgerufen wird, um Beans abzurufen

Die Lösungen

Wenn die setApplicationContext-Methode der Implementierungsklasse der ApplicationContextAware-Schnittstelle nicht ausgeführt wurde, prüfen Sie zunächst, ob die Implementierungsklasse auf Lazy Loading eingestellt ist oder ob das Projekt globales Lazy Loading konfiguriert hat.

In diesem Projekt wurde das Problem durch die Erstellungsreihenfolge der Implementierungsklassen der Schnittstellen ApiEnhancer und ApplicationContextAware verursacht, und die Api-Klasse ist nur eine reguläre RESTful-API, die Geschäftslogik verarbeitet und geladen werden kann, wenn sie von der Front aufgerufen wird. Endseite. Daher wurde das Problem durch die Umstellung auf verzögertes Laden gelöst.

Es ist ratsam, die Abhängigkeitsbeziehung zwischen Klassen hinsichtlich der Ladereihenfolge zu minimieren. Wenn dies unvermeidbar ist, können Lazy Loading oder Anmerkungen wie @DependsOn, @Order, @Priority verwendet werden, um die Ladereihenfolge von Beans zu steuern.


Warum ist die Erstellungsreihenfolge der Produktionsumgebung und der Testumgebung unterschiedlich?

Lassen Sie uns debuggen, um den Scanvorgang von Spring zu überprüfen.

Beginnend mit der Scan-Methode von ClassPathBeanDeterminationScanner.

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

doScan-Methode

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

scanCandidateComponents-Methode von ClassPathScanningCandidateComponentProvider

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

findAllClassPathResources-Methode von PathMatchingResourcePatternResolver

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

doFindPathMatchingJarResources-Methode

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

JarFile ist eine Klasse in der Java-Standardbibliothek unter dem Paket java.util.jar, die ZipFile erbt und erweitert. jarFile.entries() gibt einen Iterator namens JarEntryIterator.

zurück

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

JarExitIterator ist eine Implementierung des Iterator Pattern, das die Einträge der übergeordneten Klasse von JarFile iteriert.

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

Die Einträge-Methode von ZipFile gibt einen Iterator namens ZipExitIterator zurück.

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

Die nextElement-Methode von ZipExitIterator ruft die nächste Methode auf, die wiederum die getNextEntry-Methode aufruft.

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

getNextEntry ist eine native Methode.

The setApplicationContext method execution issue of the applicationContextAware interface and failed to get Spring beans

Die native Methode wird in Nicht-Java-Sprachen implementiert und innerhalb der Java Virtual Machine aufgerufen, um die zugrunde liegende Funktionalität zu implementieren, die je nach Umgebung (Betriebssystem oder JDK-Version) variieren kann. JAR-Pakete selbst haben keine Reihenfolge, daher kann die tatsächliche Durchlaufreihenfolge je nach verschiedenen JAR-Paketierungstools und -umgebungen variieren.

Das obige ist der detaillierte Inhalt vonDas Ausführungsproblem der setApplicationContext-Methode der applicationContextAware-Schnittstelle führte dazu, dass Spring Beans nicht abgerufen werden konnten. 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

AI Hentai Generator

AI Hentai Generator

Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

R.E.P.O. Energiekristalle erklärten und was sie tun (gelber Kristall)
2 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Repo: Wie man Teamkollegen wiederbelebt
4 Wochen vor By 尊渡假赌尊渡假赌尊渡假赌
Hello Kitty Island Abenteuer: Wie man riesige Samen bekommt
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)

Top 4 JavaScript -Frameworks in 2025: React, Angular, Vue, Svelte Top 4 JavaScript -Frameworks in 2025: React, Angular, Vue, Svelte Mar 07, 2025 pm 06:09 PM

Top 4 JavaScript -Frameworks in 2025: React, Angular, Vue, Svelte

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache? Mar 17, 2025 pm 05:44 PM

Wie implementiere ich mehrstufige Caching in Java-Anwendungen mit Bibliotheken wie Koffein oder Guava-Cache?

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle? Mar 17, 2025 pm 05:35 PM

Wie funktioniert der Klassenladungsmechanismus von Java, einschließlich verschiedener Klassenloader und deren Delegationsmodelle?

Node.js 20: wichtige Leistungssteigerung und neue Funktionen Node.js 20: wichtige Leistungssteigerung und neue Funktionen Mar 07, 2025 pm 06:12 PM

Node.js 20: wichtige Leistungssteigerung und neue Funktionen

ICEBERG: Die Zukunft von Data Lake Tabellen ICEBERG: Die Zukunft von Data Lake Tabellen Mar 07, 2025 pm 06:31 PM

ICEBERG: Die Zukunft von Data Lake Tabellen

Spring Boot Snakeyaml 2.0 CVE-2022-1471 Problem behoben Spring Boot Snakeyaml 2.0 CVE-2022-1471 Problem behoben Mar 07, 2025 pm 05:52 PM

Spring Boot Snakeyaml 2.0 CVE-2022-1471 Problem behoben

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden? Mar 17, 2025 pm 05:43 PM

Wie kann ich JPA (Java Persistence-API) für Objektrelationszuordnungen mit erweiterten Funktionen wie Caching und faulen Laden verwenden?

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung? Mar 17, 2025 pm 05:46 PM

Wie benutze ich Maven oder Gradle für das fortschrittliche Java -Projektmanagement, die Erstellung von Automatisierung und Abhängigkeitslösung?

See all articles