Tauchen Sie tief in den Frühling ein und beginnen Sie mit dem Quellcode!
Entdecken Sie das beliebteste Java-Framework, verstehen Sie seine internen Mechanismen und machen Sie sich vom Anfänger zum Experten.
⚡ Technologie |. Warum |
⚡Technologie
Einführung
Hallo zusammen, mein Name ist Lex?. Ich bin ein Java-Backend-Entwickler mit 8 Jahren Erfahrung und ein Programmierer, der sich leidenschaftlich für das Spring-Framework begeistert❤️. Um Programmierern zu helfen, die mehr über das Spring-Framework erfahren möchten, habe ich diese „Spring Source Code Reading Series“ erstellt. Ich hoffe, dass ich mit dieser Serie gemeinsam mit Ihnen das Innenleben des Frühlings erforschen kann. Wenn Sie das gleiche Interesse oder die gleichen Fragen haben, kontaktieren Sie mich bitte!
Warum analysiert Spring den Quellcode ?
Bei meiner Arbeit als Entwickler, der an Frameworks arbeitet, stoße ich häufig auf Situationen, in denen ich das Framework-Verhalten genau verstehen und anpassen muss. Bei diesen Aufgaben geht es nicht nur um die einfache Verwendung der API des Frameworks, sondern es ist auch ein detailliertes Verständnis der internen Funktionsweise des Frameworks erforderlich. Obwohl es auf Github vereinfachte Versionen von Spring gibt, die für den Einstieg tatsächlich sehr hilfreich sind, unterscheiden sie sich bei echten Projektanwendungen dennoch stark vom echten Spring-Framework. Deshalb begann ich, mich mit dem Quellcode von Spring zu befassen, in der Hoffnung, seinen internen Arbeitsmechanismus besser zu verstehen, damit ich ihn besser auf meine tatsächliche Arbeit anwenden kann. Das Teilen meiner Quellcode-Analyse dient auch dazu, Entwicklern, die Spring wirklich verstehen und nicht nur verwenden möchten, Referenzen und Hilfestellung zu geben.
Gib mir einfach einen Stern
Liebe Freunde, ich habe wirklich viel Zeit damit verbracht, diese „Spring Source Code Reading Series“ zu recherchieren und zu organisieren. Wenn Sie der Meinung sind, dass das Ding nicht schlecht ist oder es Ihnen ein wenig geholfen hat, klicken Sie bitte auf den Stern. Es bedeutet mir wirklich sehr viel und jeder Stern gibt mir das Gefühl, dass sich die harte Arbeit gelohnt hat. Ich weiß, das ist eine Kleinigkeit, aber Ihr Klick ist für mich die beste Ermutigung. Wie auch immer, vielen Dank, dass Sie sich die Zeit genommen haben, meine Inhalte zu lesen. Ich weiß das wirklich zu schätzen!
?Frühlings-Quellcode-Leseserie
Federkern
Laden und Zugreifen auf Ressourcen
Ressource: abstrakte Schnittstelle, die Dateien, Klassenpfade usw. darstellt und für den Zugriff auf Ressourcen aus verschiedenen Quellen verwendet wird.
ResourceLoader: Die Kernschnittstelle für die Ressourcenbeschaffung, die die Strategie des gleichmäßigen Ladens von Ressourcen von verschiedenen Standorten aus umsetzt.
ResourcePatternResolver: Schnittstelle zur Ressourcenmusterauflösung, die zum flexiblen Laden mehrerer Ressourcen in Anwendungen verwendet wird.
DocumentLoader: Kernschnittstelle zum Laden und Parsen von XML-Dokumenten, die die automatische Konfiguration von Spring-Anwendungen im Hintergrund unterstützt.
Metadaten und Filterung
MetadataReader: Der Kern der Klassenmetadatenerfassung, der erweiterte Funktionen wie Komponentenscan, bedingte Anmerkungen und AOP unterstützt.
AnnotationMetadata: Rufen Sie Annotationsinformationen zur Laufzeitklasse dynamisch ab und bearbeiten Sie sie.
TypeFilter: Passen Sie die Klassenfilterung während des Komponentenscans an und unterstützen Sie komplexe Bedingungen und präzise Filterung.
Bedingung: Bedingte Beurteilung, ein flexibler Mechanismus, der die Erstellung und Konfiguration von Beans bestimmt.
Validierung, Datenbindung und Typkonvertierung
Validator: Bietet benutzerdefinierte Datenvalidierungslogik, um sicherzustellen, dass Modellobjekte Geschäftsregeln erfüllen.
PropertyEditor: Passen Sie die Konvertierungslogik von JavaBean-Eigenschaften an und verwalten Sie die Konvertierung von Eigenschaftstypen.
Konverter: Wird für die Konvertierung zwischen verschiedenen Typen verwendet und definiert einfache Regeln für die Konvertierung von Quell- in Zieltypen.
ConverterFactory: Erstellt einen Konverter für einen bestimmten Quelltyp zur Typkonvertierung.
GenericConverter: Ein komplexerer Konverter, der mehrere Quell- und Zieltypkonvertierungen unterstützt.
ConditionalConverter: Ein Konverter, der anhand von Bedingungen entscheidet, ob eine Konvertierung durchgeführt werden soll.
ConversionService: Stellt eine einheitliche Typkonvertierungsdienstschnittstelle bereit und verwaltet Konverter.
Drucker: Wird zum Formatieren von Objekten in Text verwendet, wobei der Schwerpunkt auf der formatierten Ausgabe liegt.
Parser: Wird zum Parsen von Text in Objekte verwendet, wobei der Schwerpunkt auf der Parsing-Logik liegt.
Spring Expression Language (SpEL)
ExpressionParser: Analysiert einen SpEL-Ausdruck in Zeichenfolgenform, erstellt eine Ausdrucksinstanz und gibt sie zurück.
Ausdruck: Die Funktion zum Auswerten von Ausdruckszeichenfolgen, zum Unterstützen von Vorgängen wie Typkonvertierung und zum Erhalten von Originalzeichenfolgen.
EvaluationContext: verwaltet die Kontextinformationen von SpEL-Ausdrücken.
PropertyAccessor: Wird zum Lesen und Schreiben von Eigenschaften von Objekten verwendet und kann zum Implementieren einer benutzerdefinierten Eigenschaftszugriffslogik verwendet werden.
ConstructorResolver: Analysiert den Konstruktor, um zu bestimmen, wie die Bean instanziiert wird.
MethodResolver: Klassenmethoden auflösen, um korrekte Aufrufe sicherzustellen, Überladungen und Parameterübereinstimmungen zu bewältigen.
BeanResolver: Bean-Definition analysieren, einschließlich Abhängigkeiten, Eigenschaftseinstellungen, Instanziierung und Rückgabe.
TypeLocator: Sucht dynamisch nach Klassen und gibt Klassenobjekte zurück, die beim Parsen von Ausdrücken, bei der Typkonvertierung usw. verwendet werden.
TypeConverter: Typkonvertierungsfunktion, die Daten in einem Ausdruck von einem Typ in einen anderen konvertiert.
TypeComparator: Typvergleichsfunktion, die eine Methode zum Vergleichen definiert, ob zwei Objekte gleich sind.
OperatorOverloader: Funktion zum Überladen von Operatoren, eine Methode zum Anpassen von Operatoren in Ausdrücken.
Bean-Definition und -Registrierung
BeanDefinition: Bean im Detail beschreiben und Kernfunktionen wie Abhängigkeitsinjektion, AOP und Bereichskontrolle unterstützen.
BeanDefinitionHolder: Die Schlüsselklasse zum Verwalten und Betreiben von BeanDefinition.
BeanDefinitionRegistry: Verwaltungsschlüsselschnittstelle für die Bean-Definitionsregistrierung, Verarbeitung von Bean-Metadaten.
Lesen und Scannen von Bean-Definitionen
XmlBeanDefinitionReader: XML-Konfiguration laden und analysieren, IOC-Container erstellen und Bean-Definition registrieren.
PropertiesBeanDefinitionReader: Die Eigenschaftendatei wird geladen und in die Bean-Definition analysiert.
GroovyBeanDefinitionReader: Groovy-Skripte werden in Bean-Definitionen geparst.
AnnotatedBeanDefinitionReader: Annotationskonfiguration, scannt und registriert automatisch Spring-Komponenten und vereinfacht die Bean-Definitionskonfiguration.
ClassPathBeanDefinitionScanner: Das Scannen von Klassenpfaden registriert Spring Beans und unterstützt die automatische Assemblierung.
Bohnenfabrik
BeanFactory: Die Kernschnittstelle von Spring, die grundlegende Funktionen für die Bean-Konfiguration, -Erstellung und -Verwaltung bereitstellt.
ListableBeanFactory: Unterstützt das Abrufen einer Sammlung von Bohnen nach Typ.
HierarchicalBeanFactory: Unterstützt die Beziehung zwischen übergeordneten und untergeordneten Containern und implementiert die hierarchische Struktur der Bean-Definition.
ConfigurableBeanFactory: Bietet Erweiterungen zur BeanFactory-Konfiguration, z. B. Eigenschafteneditor, Bereich usw.
AutowireCapableBeanFactory: Kernfunktionale Schnittstelle für die Erstellung, Initialisierung, Injektion und Zerstörung von Beans.
ConfigurableListableBeanFactory: Konfigurierbare Bean-Factory-Schnittstelle, die Konfigurations- und Listenvorgänge unterstützt.
Containerkontext
ClassPathXmlApplicationContext: Der Kontext, in dem der Klassenpfad die XML-Konfigurationsdatei lädt.
AnnotationConfigApplicationContext: Der Kontext zum Laden von Konfigurationsinformationen in der Annotation-Konfigurationsklasse.
GenericApplicationContext: Unterstützt mehrere Konfigurationsmethoden, XML, Anmerkungen und manuell registrierte Kontexte.
Import und Kombination von Bean-Definitionen
ImportBeanDefinitionRegistrar: Beans zur Laufzeit dynamisch registrieren, um eine flexible Konfiguration zu erreichen und die Funktionen der Konfigurationsklasse zu erweitern.
ImportSelector: Importieren Sie Konfigurationsklassen dynamisch zur Laufzeit, um eine bedingte Auswahl und eine flexible Konfiguration zu erreichen.
DeferredImportSelector: Konfiguration dynamisch zur Laufzeit importieren, unterstützt bedingte Auswahl und verzögertes Laden nach Gruppe.
Lebenszyklus einer Bohne
Registrierungsprozess für Bean-Definitionen: Laden und Parsen von Konfigurationsdateien, Registrieren und Parsen von Bean-Definitionen, Klassennamen, Bereichen, Attributen usw.
Bean-Initialisierungsprozess: Instanziierung, Eigenschaftsinjektion, Aware-Rückruf, Postprozessor, Aufruf der Initialisierungsmethode.
Beans Abhängigkeitsauflösungsprozess: Abhängigkeiten deklarieren, Abhängigkeiten finden, Abhängigkeiten einfügen, zirkuläre Abhängigkeiten verarbeiten und die Abhängigkeitsauflösung verzögern.
Bean-Zerstörungsprozess: Aufruf der Zerstörungsmethode, Schnittstellenrückruf, Bereinigung nach der Verarbeitung, Auslösen von Benachrichtigungen, Recycling von GC-Ressourcen.
Parsen von Eigenschaften und Umgebungskonfiguration
PropertySource: Eine abstrakte Klasse, die verschiedene Konfigurationsquellen verwaltet und das flexible Laden und Zugreifen auf Anwendungskonfigurationen unterstützt.
PropertySources: Wird zur einheitlichen Verwaltung und zum Zugriff auf mehrere PropertySource-Instanzen verwendet, wodurch die Verarbeitung von Konfigurationsdaten vereinfacht wird.
PropertyResolver: Universelles Parsen von Eigenschaften, Abrufen von Konfigurationswerten, Behandeln fehlender Eigenschaften, einfach und flexibel.
ConfigurablePropertyResolver: Eigenschaftenparsing-Konfiguration und Platzhaltereinstellungen zur Anpassung an unterschiedliche Konfigurationsanforderungen.
Umgebung: Darstellung der Anwendungsumgebung, Bereitstellung des Attributzugriffs, Unterstützung von Konfigurationsdateien und Realisierung dynamischer Konfiguration.
Konfigurierbare Umgebung: Konfigurieren Sie die Anwendungsumgebung dynamisch, aktivieren Sie die Standardkonfiguration und verbessern Sie die Anwendungsflexibilität.
Bean-Initialisierungs- und Erweiterungspunkte
InitializingBean: Stellt eine Schnittstelle zum Ausführen benutzerdefinierter Logik während der Bean-Initialisierung bereit.
EinwegBean: Definiert die Schnittstelle zum Durchführen von Bereinigungsvorgängen, bevor die Bean zerstört wird.
BeanDefinitionRegistryPostProcessor: BeanDefinition beim Start des Containers dynamisch ändern oder hinzufügen.
BeanFactoryPostProcessor: BeanFactory global ändern oder konfigurieren, bevor die Bean instanziiert wird.
BeanPostProcessor: Führen Sie vor und nach der Bean-Initialisierung eine benutzerdefinierte Verarbeitung durch, die sich auf alle Beans auswirken kann.
InstantiationAwareBeanPostProcessor: Bietet eine tiefergehende Kontrolle der Instanziierung und Eigenschaftsinjektion.
DestructionAwareBeanPostProcessor: Ermöglicht zusätzliche Bereinigungsvorgänge, bevor die Bean zerstört wird.
MergedBeanDefinitionPostProcessor: Verarbeitet BeanDefinition beim Zusammenführen von Bean-Definitionen.
SmartInstantiationAwareBeanPostProcessor: Bietet eine intelligentere Instanziierungssteuerung.
SmartInitializingSingleton: Benutzerdefinierte Logik ausführen, nachdem alle Singleton-Beans initialisiert wurden.
Aware-Schnittstellenserie
BeanNameAware: Lassen Sie die Bean ihren eigenen Namen im Container erhalten.
BeanClassLoaderAware: Ermöglicht einer Bean, ihren Klassenlader abzurufen.
BeanFactoryAware: Stellt Bean bereit, die BeanFactory abzurufen, zu der es gehört.
EnvironmentAware: Ermöglicht Beans, die Konfiguration der Anwendungsumgebung abzurufen.
EmbeddedValueResolverAware: Ermöglicht Beans, Platzhalter für eingebettete Werte aufzulösen.
@Primary: Gibt die bevorzugte Bean an, die aus mehreren Kandidaten-Beans zuerst ausgewählt werden soll.
@Description: Geben Sie beschreibende Informationen für die Bean an.
@Role: Bietet Rollenhinweise für Beans, um Beans ähnlicher Typen zu unterscheiden.
@Indexed: Markiert die Bean für die Indizierung.
@Order: Geben Sie die Ladereihenfolge der Bohnen an.
JSR-Spezifikation
@Inject: JSR-330-Standardanmerkung zur Abhängigkeitsinjektion.
@Named: JSR-330-Standardbenennungsanmerkung.
@Resource: Java EE-Standardanmerkung zur Ressourceninjektion.
@Qualifier: Wird zur Qualifizierung injizierter Bohnen verwendet.
@Scope: Gibt den Geltungsbereich der Bean an.
@Singleton: Geben Sie die Bean als Singleton an.
@PostConstruct: Geben Sie die Initialisierungsmethode an.
@PreDestroy: Geben Sie die Zerstörungsmethode an.
Anbieter: Eine gemeinsame Bean-Factory-Schnittstelle, die von der Java-Standardbibliothek bereitgestellt wird.
Frühlings-AOP
Dynamischer JDK-Proxy: Schnittstellenimplementierung, dynamische Generierung von Proxy-Klassen, Verarbeitung von Methodenaufrufen und einheitliche Querschnittsthemen.
Dynamischer Cglib-Proxy: Eine auf Bytecode-Generierung basierende Bibliothek, für die keine Schnittstelle erforderlich ist und die Klassenmethoden abfangen und verbessern kann.
ClassFilter: Bestimmt, ob die Klasse die Abfangbedingung erfüllt.
MethodMatcher: Bestimmen Sie, ob die Methode mit der Abfangbedingung übereinstimmt.
Pointcut: Definieren Sie den Einstiegspunkt und passen Sie die abgefangene Methode an.
Hinweis: Die Kernschnittstelle in AOP, die verschiedene Verhaltensweisen von Benachrichtigungstypen definiert.
MethodInterceptor: Fängt die Methodenausführung ab und ermöglicht das Hinzufügen zusätzlicher Logik davor und danach.
MethodBeforeAdvice: Ermöglicht das Einfügen benutzerdefinierter Logik vor Methodenaufrufen.
AfterReturningAdvice: Ermöglicht das Einfügen benutzerdefinierter Logik nach einem Methodenaufruf. <
ThrowsAdvice: Ausnahmebenachrichtigung, erfasst von Methoden ausgelöste Ausnahmen und führt zusätzliche Logik aus.
IntroductionInterceptor: Führt dynamisch neue Funktionen oder Eigenschaften in das Zielobjekt ein.
Berater: Wird zum Kombinieren von Benachrichtigungen und Pointcuts verwendet, um übergreifende Probleme bei der Aspektprogrammierung zu berücksichtigen.
Empfohlen: Konfigurieren Sie die Benachrichtigungen, Benachrichtigungen, Ziele usw. des AOP-Agenten.
ProxyFactory: Eine praktische Möglichkeit, Proxy-Objekte zu erstellen.
AopProxyFactory: Erstellen Sie eine AOP-Proxy-Factory, die JDK und CGLIB unterstützt.
AopProxy: AOP-Proxy-Objekte erstellen und verwalten.
AdvisorChainFactory: Factory-Schnittstelle zum Erstellen einer Advisor-Kette.
AdvisorAdapterRegistry: Passen Sie verschiedene Advices an AOP-Interceptors an, registrieren und verwalten Sie Advisor-Adapter.
AdvisorAdapter: Passen Sie verschiedene Arten von Benachrichtigungen an Interceptor-Ketten an.
ProxyMethodInvocation: AOP-Methodenaufruf-Proxy, verarbeitet Interceptor-Ketten und Methodenaufrufe.
AnnotationAwareAspectJAutoProxyCreator: Erstellt einen AOP-Proxy, um Aspekte im AspectJ-Stil anzuwenden.
BeanFactoryAdvisorRetrievalHelper: Hilft beim Abrufen und Verwalten von Advisor Beans in Spring AOP.
BeanFactoryAspectJAdvisorsBuilder: Erstellen Sie @AspectJ-Annotationsaspekte und generieren Sie Spring AOP Advisors.
AspectInstanceFactory: Erstellt Aspektinstanzen und unterstützt mehrere Implementierungsmethoden.
MetadataAwareAspectInstanceFactory: verwaltet Aspektinstanzen und Metadaten und unterstützt mehrere Instanziierungsstrategien.
AspectJAdvisorFactory: Erstellt eine AspectJ-Notifier-Instanz und verwaltet die Erstellung und Konfiguration von Aspektbenachrichtigungen.
TargetSource: verwaltet die Erfassung und Freigabe von AOP-Proxy-Objekten.
TargetSourceCreator: Erstellt spezielle Zielquellen und passt die Erstellung und Verwaltung von Proxy-Objekten an.
AopContext: Tool zum Abrufen von Spring AOP-Proxy-Objekten.
ExposeInvocationInterceptor: Ein Interceptor, der den Aufrufkontext der Spring AOP-Methode offenlegt.
@EnableLoadTimeWeaving: Aktivieren Sie das Spring-Load-Time-Weben.
Frühlingstransaktion
Verbindung: verwaltet Datenbankverbindungen, führt SQL aus und verarbeitet Transaktionen.
DataSource: Bietet eine Schnittstelle für die effiziente Verwaltung von Datenbankverbindungen.
DriverManager: Die Kernklasse zum Verwalten und Herstellen von Datenbankverbindungen.
JdbcTemplate: Vereinfacht JDBC-Vorgänge und bietet eine praktische Abstraktion des Datenbankzugriffs.
TransactionDefinition: Definiert das Transaktionsweitergabeverhalten und die Isolationsstufe.
TransactionAttributeSource: Strategieschnittstelle zum Abrufen von Transaktionsattributen.
PlatformTransactionManager: Wird zur Verwaltung und Koordinierung des Lebenszyklus und der Ausführung von Transaktionen verwendet.
TransactionTemplate: Vereinfacht die Transaktionsverwaltung und unterstützt die programmgesteuerte Transaktionssteuerung und Ausnahmebehandlung.
SpringTransactionAnnotationParser: Analysieren Sie die @Transactional Annotation und konvertieren Sie sie in die Transaktionskonfiguration.
TransactionInterceptor: Transaktionsinterceptor, der zur Verwaltung der Transaktionsverarbeitung auf Methodenebene verwendet wird.
EnableTransactionManagement: Aktivieren Sie die annotationsgesteuerte Transaktionsverwaltung von Spring.
SpringMVC
SpringOpenFeign
Kontaktieren Sie mich
✉️ E-Mail |. CSDN Ich über alles!
⛵Beiträge willkommen!
Wenn Sie Fehler finden oder Verbesserungsvorschläge haben, können Sie gerne einen Issue oder Pull Request einreichen. Ihr Feedback ist für mich sehr wertvoll!
Kontinuierliche Aktualisierung
Um Ihnen die neuesten und wertvollsten Inhalte bereitzustellen, werde ich darauf bestehen, dieses Lager täglich zu aktualisieren⏳. Jeden Tag können Sie mit neuen Inhalten oder Verbesserungen bestehender Inhalte rechnen. Wenn Sie Anregungen oder Feedback haben, können Sie mich gerne kontaktieren. Ich schätze jedes Feedback, weil es meine Motivation für eine kontinuierliche Verbesserung ist.
Sternengeschichte
„Sterngucker
?Forker
„Mich zu einem Lunchpaket einladen?“
Der Autor muss abends einen Blog schreiben und auch wochentags arbeiten. Wenn Sie mir helfen können, können Sie mir ein Mittagessen geben?
Folgen Sie dem öffentlichen Konto
Antworten Sie anschließend mit dem Schlüsselwort „Gruppe hinzufügen“, um unserer technischen Austauschgruppe beizutreten und mit weiteren Entwicklern zu kommunizieren und zu lernen.