„Frühling Band 18 von „Interview Eight-Part Essay“ ist wieder da. Dieses Mal habe ich die Interviewfragen zum Frühling aussortiert. Ich habe auch die Interviewfragen zum Frühling online durchgesehen und zusammengefasst. Im Grunde sind sie hier. Natürlich kann es einige zu grundlegende Konzepte geben, die ich direkt in einer bestimmten Frage organisiert habe, daher habe ich keine separate Frage eröffnet. Ich wünsche allen ein reibungsloses Interview ~
1
2. Was sind die Kernmodule im Frühling?
4
5. Was ist der Unterschied zwischen @Repository, @Compent, @Controller?
8. Was ist AOP?
9. Was ist der Unterschied zwischen dynamischem Proxy und CGLIB-Proxy?
11.Was ist der Unterschied zwischen Spring AOP und AspectJ AOP?
12. Wie ist der Lebenszyklus von Bean im Frühling?
14. Warum kann der Cache der zweiten Ebene nicht verwendet werden? lösen?
15.Was ist der Unterschied zwischen @Autowired und @Resource?
16.Was sind die Transaktionsisolationsstufen von Spring?
17.Was sind die Ausbreitungsmechanismen von Spring-Transaktionen?
18.springBoot automatisches Montageprinzip?
1. Welche Designmuster werden im Frühling verwendet? 「 2.Agent-Entwurfsmuster“
: Die Implementierung von AOP erfolgt über einen Proxy. Spring verwendet hauptsächlich den dynamischen JDK-Proxy und den CGLIB-Proxy
“3. Singleton-Entwurfsmuster“
: Beans in Spring sind standardmäßig einzeln. Beispiel
「4. Template-Methodenmuster」: In Spring verwenden jdbcTemplate und andere Klassen, die mit Template enden, das Template-Methoden-Designmuster, einige allgemeine Funktionen
「5 Muster": Unser Projekt muss eine Verbindung zu mehreren Datenbanken herstellen, und verschiedene Kunden greifen bei jedem Besuch je nach Bedarf auf unterschiedliche Datenbanken zu.Dieser Modus ermöglicht es uns, entsprechend den Kundenanforderungen dynamisch zwischen verschiedenen Datenquellen zu wechseln. 6. Beobachtermuster für ereignisgesteuerte Modelle von Spring Verbesserung oder Beratung verwendet das Adaptermuster
2. Welche Kernmodule gibt es im Frühling?
1.
"Spring Core": Spring Core, es ist der grundlegendste Teil des Frameworks, das IOC- und Dependency-Injection-DI-Funktionen bereitstellt : Es bietet Unterstützung für die Entwicklung von Webanwendungen
4."Spring MVC": Es zielt auf die Implementierung von MVC-Ideen in Webanwendungen ab
5."Spring DAO": Bietet Unterstützung für JDBC Die Abstraktion Layer vereinfacht die JDBC-Codierung und gleichzeitig ist die Codierung robuster + JDO-Integration usw.
7."Spring AOP": Aspektorientierte Programmierung, die eine mit der AOP Alliance kompatible Programmierimplementierung bietet
3. Sagen Sie mir, was Sie unter IOC verstehen?
Erstens ist IOC ein
„Container“
, der zum Laden von Objekten verwendet wird. Seine Kernidee ist „Inversion of Control“Also was genau
„Was ist Inversion of Control“
Kontrollumkehr bedeutet: „Übergeben Sie die Kontrolle über das Objekt an die Feder und verwalten Sie es durch den Federbehälter“, wir führen keine Operationen aus
Warum also „Was braucht eine Umkehrung der Kontrolle?“? „
Wenn ein Projekt vergrößert wird, ist die Aufrechterhaltung dieser Beziehung sehr mühsam. Daher gibt es das Konzept der Umkehrung der Kontrolle, das die Erstellung und Konfiguration von Objekten usw. kombiniert. Eine Reihe von Vorgängen werden von Spring verwaltet. Wenn wir sie verwenden, müssen wir sie nur abholen. 4. Was sind die IOC-Container im Frühling? Was sind die Unterschiede?
und das andere ist „ApplicationContext“ Der Unterschied zwischen ihnen besteht darin, dass BeanFactory
„nur die grundlegendsten Funktionen zum Instanziieren von Objekten und Abrufen von Objekten bereitstellt“
, ApplicationContext ist ein von BeanFactory abgeleitetes Produkt und eine Unterklasse davon . Seine Funktion ist leistungsfähiger, z. B. die Unterstützung von Annotationsinjektion, Internationalisierung und anderen Funktionen.
5. Was ist der Unterschied zwischen BeanFactory und FactoryBean? ist ein IOC-Container
, der zum Transport von Objekten verwendet wird „FactoryBean ist eine Schnittstelle“ , die Bean eine flexiblere Möglichkeit bietet. Durch Proxying eines Bean-Objekts werden einige Vorgänge vor und nach der Methode ausgeführt.
6. Was sind die Unterschiede zwischen @Repository, @Service, @Compent und @Controller? Federbehälter, es dient lediglich der Unterscheidung verschiedener Anwendungsschichten im Einsatz“
@Repository:dao-Schicht
@Service:Service-Schicht
@Controller:Controller-Schicht
@Kompetent: Andere Schichten, die nicht zu den oben genannten drei Schichten gehören, verwenden diese Annotation einheitlich
7. Was ist DI?
DI ist in der Tat das Gleiche wie IOC, aber „Das gleiche Konzept wird aus verschiedenen Blickwinkeln erklärt“
Was DI beschreibt „Der Punkt sind Abhängigkeiten“, sagten wir: „Die Kernfunktion von IOC besteht darin, einem Objekt dynamisch andere abhängige Objekte bereitzustellen, wenn das Programm ausgeführt wird.“ Diese Funktion wird beispielsweise durch DI ausgeführt ein Objekt A und dieses Objekt A hängt von einem Objekt B ab, dann müssen wir dieses Objekt B in Objekt A injizieren. Es gibt drei Injektionsmethoden im Frühjahr Injektion
8. Was ist AOP?
AOP bedeutet:
„Aspektorientierte Programmierung, die eine einheitliche Aufrechterhaltung der Programmfunktionen durch Vorkompilierung und dynamische Proxys während der Laufzeit A-Technologie erreicht“
. AOP ist
„die Fortsetzung von OOP (Objektorientierte Programmierung)“
Es ist ein wichtiger Inhalt im Spring-Framework und ein abgeleitetes Paradigma der funktionalen Programmierung. AOP kann verwendet werden, um verschiedene Teile der Geschäftslogik zu isolieren, wodurch die Kopplung zwischen verschiedenen Teilen der Geschäftslogik verringert, die Wiederverwendbarkeit von Programmen verbessert und die Entwicklungseffizienz verbessert wird.
「Die AOP-Implementierung ist hauptsächlich in zwei Kategorien unterteilt:」
„Statische AOP-Implementierung“ , AOP-Framework „Während der Kompilierungsphase“ hat den Programmquellcode geändert und eine statische AOP-Proxy-Klasse generiert (die generierte *.class-Datei wurde geändert, Sie müssen Verwenden Sie einen bestimmten Compiler), wie z. B. AspectJ
„Dynamische AOP-Implementierung“ , AOP-Framework „zur Laufzeit“ für dynamisch generierte Proxy-Objekte (im Speicher mit dynamischem JDK-Proxy oder dynamisch generiert durch die CGlib-AOP-Proxy-Klasse). ), wie z. B. SpringAOP
Die Implementierung von AOP im Frühjahr erfolgt „implementiert durch dynamischen Proxy“ Wenn die Schnittstelle implementiert ist, wird der dynamische JDK-Proxy verwendet, andernfalls wird der CGLIB-Proxy verwendet.
"Es gibt 5 Benachrichtigungstypen:"
"@Before": Benachrichtigen, bevor die Zielmethode aufgerufen wird
"@AfterReturning": Rückgabe oder Ausnahme beim Ziel Methode kehrt nach dem Aufruf zurück
「@AfterThrowing」: Wird aufgerufen, nachdem die Zielmethode zurückgegeben wurde
「@After」: Wird aufgerufen, nachdem die Zielmethode eine Ausnahme hat
「@Around」 : Wird aufgerufen, nachdem die Zielmethode eine Ausnahme zurückgegeben hat. Kapseln Sie sie und bestimmen Sie die Aufrufzeit selbst.
9 Was ist der Unterschied zwischen dynamischem Proxy und statischem Proxy?
Quellcode wird von Programmierern erstellt oder von bestimmten Tools automatisch generiert und dann kompiliert. Bevor das Programm ausgeführt wird, ist die .class-Datei der Proxy-Klasse bereits vorhanden.
Statischer Proxy repräsentiert normalerweise nur eine Klasse
Dynamisch erstellt mithilfe des Reflexionsmechanismus, wenn das Programm ausgeführt wird.
Ein dynamischer Proxy ist ein Proxy für mehrere Implementierungsklassen unter einer Schnittstelle.
Ein dynamischer Proxy weiß nicht, was er vermitteln soll, er weiß nur, wann läuft
10 Was ist der Unterschied zwischen dem dynamischen JDK-Proxy und dem CGLIB-Proxy?
JDK dynamische Proxy-Geschäftsklasse „muss eine bestimmte Schnittstelle implementieren“ , die
„basierend auf einem Reflexionsmechanismus implementiert“ ist
Sie generiert eine Proxy-Klasse, die dieselbe Schnittstelle implementiert, und schreibt dann die Methode neu Verbesserungen am Code erzielen.
Der dynamische CGLIB-Proxy verwendet das Bytecode-Verarbeitungsframework ASM. Sein Prinzip besteht darin, mithilfe der Bytecode-Technologie „eine Unterklasse für eine Klasse zu erstellen und dann die Methode der übergeordneten Klasse zu überschreiben“, um den Code zu verbessern.
11.Was ist der Unterschied zwischen Spring AOP und AspectJ AOP? Spring AOP ist eine Laufzeitverbesserung, die durch
„Dynamische Proxy-Implementierung“ erreicht wird.
AspectJ AOP ist eine Erweiterung zur Kompilierungszeit, für deren Vervollständigung ein spezieller Compiler erforderlich ist und die durch
„Änderung des Codes“ erreicht wird.
, Unterstützung „drei Webmethoden“
"Weben zur Kompilierungszeit": Es dient zum Weben verwandter Proxy-Klassen beim Kompilieren des Bytecodes
"Weben nach dem Kompilieren": Nach dem Kompilieren der ursprünglichen Klasse wird festgestellt, dass eine AOP-Verbesserung erforderlich ist. und dann Weben Geben Sie den entsprechenden Code ein
„Weben, wenn die Klasse geladen wird“ : Bezieht sich auf das Weben, wenn der Lader die Klasse lädt
Hauptunterschied
Spring AOP
AspecjtJ AOP
Erweiterungsmethode
Laufzeitverbesserung
Kompilierungszeit
Implementierungsmethode
Dynamischer Proxy
Änderungscode
?
Kompilierungszeit, nach der Kompilierung Klassenladezeit
12. Was ist der Lebenszyklus von Beans im Frühling?
2."Attribute füllen", der Bean einen Wert zuweisen
3."Initialisierung"
Wenn die Aware-Schnittstelle implementiert ist, werden Containerressourcen über ihre Schnittstelle abgerufen
Wenn die BeanPostProcessor-Schnittstelle implementiert ist, werden die Vor- und Nachverarbeitungserweiterungen der Schnittstelle zurückgerufenWenn die Init-Methodenmethode konfiguriert ist, wird die Methode ausgeführt
4. "Zerstören"
Wenn die DisposibleBean-Schnittstelle implementiert ist, wird die Zerstörungsmethode der Schnittstelle zurückgerufen
Wenn die Methode der Zerstörungsmethode konfiguriert ist, wird die durch die Zerstörungsmethode konfigurierte Methode ausgeführt 13.Spring Wie löst man die zirkuläre Abhängigkeit? Lösen Sie die zirkuläre Abhängigkeit. Seine Kernlogik besteht darin, die Schritte der Instanziierung und Initialisierung zu trennen und sie dann zum Aufruf durch ein anderes Objekt in den Cache zu legen
„Cache der ersten Ebene“: Wird zum Speichern von Objekten verwendet, die instanziiert und initialisiert wurden.
„Cache der zweiten Ebene“: Wird zum Speichern von Objekten verwendet, die instanziiert, aber nicht initialisiert wurden "Cache der dritten Ebene"
: Wird verwendet, um eine Objektfabrik zu speichern und eine anonyme innere Klasse zum Erstellen von Objekten im Cache der zweiten Ebene bereitzustellen
Wenn ein Zirkelverweis zwischen den Klassen A und B auftritt Grober Prozess
1 . Nachdem A die Instanziierung abgeschlossen hat, gehen Sie zu
„Erstellen Sie eine Objektfabrik und legen Sie sie im Cache der dritten Ebene ab.“
Proxy
Wenn A kein Proxy durch AOP ist, erhält diese Fabrik das von A instanziierte Objekt
2. Wenn A die Attributinjektion durchführt, gehen Sie zu
„B erstellen“
3 .B erfordert A für die Attributinjektion, dann „Holen Sie sich das A-Factory-Proxy-Objekt aus dem Cache der dritten Ebene“
und injizieren Sie es, löschen Sie dann die A-Factory im Cache der dritten Ebene und legen Sie das A-Objekt in der zweiten Ebene ab Cache
4.B Führen Sie die nachfolgende Attributinjektion durch, bis die Initialisierung abgeschlossen ist, und legen Sie B in den Cache der ersten Ebene ab
5."A ruft B aus dem Cache der ersten Ebene ab und injiziert B"
, bis die nachfolgenden Vorgänge abgeschlossen sind, löschen Sie A aus dem Cache der zweiten Ebene und legen Sie es in den Cache der ersten Ebene, und die zirkuläre Abhängigkeit endet
spring Es gibt zwei Voraussetzungen für die Lösung zirkulärer Abhängigkeiten:
1.„Nicht alle Konstruktormethoden“zyklische Abhängigkeit (andernfalls können die Initialisierungs- und Instanziierungsvorgänge nicht getrennt werden)
2.„Muss ein Singleton sein“(andernfalls kann nicht garantiert werden, dass es dasselbe ist Objekt)
14. Warum kann der Cache der zweiten Ebene das Problem nicht lösen? Nur wenn tatsächlich zirkuläre Abhängigkeiten auftreten, andernfalls wird nur „eine Fabrik erstellt und in den Cache der dritten Ebene gelegt“, es werden jedoch keine Objekte über diese Fabrik erstellt.
Wenn Sie den Cache der zweiten Ebene verwenden, um zirkuläre Abhängigkeiten aufzulösen, bedeutet dies, dass alle Beans den AOP-Proxy nach der Instanziierung abschließen müssen, was „gegen die Prinzipien des Spring-Designs verstößt“ Spring wird im letzten Schritt des Beans entworfen Lebenszyklus Um den AOP-Proxy abzuschließen, anstatt den AOP-Proxy unmittelbar nach der Instanziierung auszuführen.
15. Was ist der Unterschied zwischen @Autowired und @Resource?
„@Resource ist Javas eigene Annotation“
, @Resource hat zwei wichtigere Attribute, nämlich Name und Typ; Spring löst das Namensattribut der @Resource-Annotation in den Namen der Bean und das Typattribut in den Bean-Typ auf. Wenn also das Namensattribut verwendet wird, wird die automatische Injektionsstrategie byName verwendet, und wenn das Typattribut verwendet wird, wird die automatische Injektionsstrategie byType verwendet. Wenn weder der Name noch das Typattribut angegeben sind, wird die automatische Injektionsstrategie byName über den Reflexionsmechanismus verwendet.
„@Autowired ist eine Annotation von Spring“
, die in der Spring2.5-Version eingeführt wurde, injiziert nur basierend auf dem Typ, „stimmt nicht mit dem Namen überein“
. Wenn der Typ das injizierte Objekt nicht identifizieren kann, muss es mit @Qualifier- oder @Primary-Annotationen versehen werden. Was sind die Transaktionsisolationsstufen von Spring?
1.
「propagation_required」
Die aktuelle Methode „muss in einem Kontext mit einer Transaktion ausgeführt werden“
Wenn eine Client-Transaktion läuft, wird das aufgerufene Ende ausgeführt Andernfalls wird die Transaktion erneut eröffnet.(Wenn auf der aufgerufenen Seite eine Ausnahme auftritt, werden sowohl die Transaktionen auf der aufrufenden Seite als auch auf der aufgerufenen Seite zurückgesetzt.) Transaktionskontext, aber wenn vorhanden Wenn es sich um eine Transaktion handelt, kann sie auch in dieser Transaktion ausgeführt werden.
3 „, wenn keine Transaktion vorhanden ist, wird eine Ausnahme ausgelöst
4.「propagation_nested」
Wenn in der aktuellen Methode eine Transaktion ausgeführt wird, sollte die Methode "in einer verschachtelten Transaktion ausgeführt werden „, die verschachtelte Transaktion kann unabhängig von der gekapselten Transaktion festgeschrieben oder zurückgesetzt werden. Wenn die gekapselte Transaktion vorhanden ist und die äußere Transaktion eine Rollback-Ausnahme auslöst, muss die innere Transaktion zurückgesetzt werden. Im Gegensatz dazu hat die innere Transaktion keinen Einfluss auf die äußere Transaktion. Wenn die gekapselte Transaktion nicht vorhanden ist, ist sie dasselbe wie propagation_required
5.「propagation_never」
Der aktuelle Dienst sollte nicht in einer Transaktion ausgeführt werden. Wenn「Es gibt eine Transaktion Ausnahme wird ausgelöst „
6.“propagation_requires_new“
Die aktuelle Methode „muss in einer eigenen Transaktion ausgeführt werden“. Eine neue Transaktion wird gestartet, und wenn eine vorhandene Transaktion ausgeführt wird, wird diese Methode während der Laufzeit angehalten, bis die neue Transaktion festgeschrieben oder zurückgesetzt wird.
7.「propagation_not_supported」
Methode sollte nicht innerhalb einer Transaktion ausgeführt werden.„Wenn eine Transaktion ausgeführt wird, wird sie während der Laufzeit ausgesetzt und die Ausführung wird erst wieder aufgenommen, wenn die Transaktion festgeschrieben oder zurückgesetzt wird.“
1. Wenn der Container startet, ruft er die selectImports-Methode von EnableAutoConfigurationImportSelector.class auf „Eine umfassende Liste häufig verwendeter BeanConfiguration abrufen“
2 -boot-autoconfigure.jar unter spring.factories,
„Erhalten Sie den vollständig qualifizierten Klassennamen aller Spring-bezogenen Beans“
3. Fahren Sie dann fort
„Rufen Sie den Filter auf, um einen nach dem anderen zu filtern“ und filtern Sie ihn heraus einige, die wir nicht benötigen.
4 Schließlich fügen Sie die qualifizierte BeanConfiguration in den Attributwert in der Standardklasse EnableConfigurationPropertie ein und
„injizieren Sie sie in die IOC-Umgebung“
Das obige ist der detaillierte Inhalt von„Interview Eight-Part Essay', Frühjahrsband 18. 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
Im Jahr 2023 ist die KI-Technologie zu einem heißen Thema geworden und hat enorme Auswirkungen auf verschiedene Branchen, insbesondere im Programmierbereich. Die Bedeutung der KI-Technologie wird den Menschen zunehmend bewusst, und die Spring-Community bildet da keine Ausnahme. Mit der kontinuierlichen Weiterentwicklung der GenAI-Technologie (General Artificial Intelligence) ist es entscheidend und dringend geworden, die Erstellung von Anwendungen mit KI-Funktionen zu vereinfachen. Vor diesem Hintergrund entstand „SpringAI“ mit dem Ziel, den Prozess der Entwicklung von KI-Funktionsanwendungen zu vereinfachen, ihn einfach und intuitiv zu gestalten und unnötige Komplexität zu vermeiden. Durch „SpringAI“ können Entwickler einfacher Anwendungen mit KI-Funktionen erstellen, wodurch diese einfacher zu verwenden und zu bedienen sind.
So implementieren Sie programmgesteuerte Spring-Transaktionen: 1. Verwenden Sie TransactionCallback und TransactionCallbackWithoutResult; 4. Verwenden Sie TransactionTemplate in Kombination mit @Transactional;
Als Branchenführer bietet Spring+AI durch seine leistungsstarke, flexible API und erweiterte Funktionen führende Lösungen für verschiedene Branchen. In diesem Thema werden wir uns mit den Anwendungsbeispielen von Spring+AI in verschiedenen Bereichen befassen. Jeder Fall wird zeigen, wie Spring+AI spezifische Anforderungen erfüllt, Ziele erreicht und diese LESSONSLEARNED auf ein breiteres Anwendungsspektrum ausdehnt. Ich hoffe, dieses Thema kann Sie dazu inspirieren, die unendlichen Möglichkeiten von Spring+AI tiefer zu verstehen und zu nutzen. Das Spring-Framework hat eine mehr als 20-jährige Geschichte im Bereich der Softwareentwicklung, und seit der Veröffentlichung der Spring Boot 1.0-Version sind 10 Jahre vergangen. Nun kann niemand diesen Frühling bestreiten
Java implementiert geplante Aufgaben In der mit Jdk gelieferten Bibliothek gibt es zwei Möglichkeiten, geplante Aufgaben zu implementieren: eine ist Timer und die andere ist ScheduledThreadPoolExecutor. Wenn Timer+TimerTask einen Timer erstellt, wird ein Thread erstellt, der zum Planen von TimerTask-Aufgaben verwendet werden kann. Der Timer verfügt über vier Konstruktionsmethoden. Sie können den Namen des Timer-Threads angeben und angeben, ob er als Daemon-Thread festgelegt werden soll. Der Standardname ist Timer-Nummer und der Standardname ist kein Daemon-Thread. Es gibt drei Hauptmethoden: cancel(): Aufgabenplanung beenden, alle derzeit geplanten Aufgaben abbrechen, laufende Aufgaben sind davon nicht betroffen. purge(): Aufgaben aus der Aufgabenwarteschlange entfernen
SpringBoot und SpringCloud sind beides Erweiterungen des Spring Framework, die Entwicklern dabei helfen, Microservice-Anwendungen schneller zu erstellen und bereitzustellen. Sie haben jedoch jeweils unterschiedliche Zwecke und Funktionen. SpringBoot ist ein Framework zum schnellen Erstellen von Java-Anwendungen, das es Entwicklern ermöglicht, Spring-basierte Anwendungen schneller zu erstellen und bereitzustellen. Es bietet eine einfache und leicht verständliche Möglichkeit, eigenständige, ausführbare Spring-Anwendungen zu erstellen
Mit der Aktualisierung und Iteration der Technologie begann Java5.0, Anmerkungen zu unterstützen. Als führendes Framework in Java hat Spring seit der Aktualisierung auf Version 2.5 langsam damit begonnen, die XML-Konfiguration aufzugeben, und es werden mehr Annotationen zur Steuerung des Spring-Frameworks verwendet.
So legen Sie die Transaktionsisolationsstufe in Spring fest: 1. Verwenden Sie die Annotation @Transactional. 3. Legen Sie sie in der Spring-Konfigurationsdatei fest. 4. Legen Sie sie in der Java-Konfigurationsklasse fest. Detaillierte Einführung: 1. Verwenden Sie die Annotation @Transactional, fügen Sie die Annotation @Transactional zu der Klasse oder Methode hinzu, die eine Transaktionsverwaltung erfordert, und legen Sie die Isolationsstufe im Attribut fest. 2. In der Spring-Konfigurationsdatei usw.
Als Java-Entwickler ist das Erlernen und Verwenden des Spring-Frameworks eine wesentliche Fähigkeit. Mit der Popularität von Cloud Computing und Microservices ist das Erlernen und Verwenden von Spring Cloud zu einer weiteren Fähigkeit geworden, die beherrscht werden muss. SpringCloud ist ein auf SpringBoot basierendes Entwicklungstoolset zum schnellen Aufbau verteilter Systeme. Es bietet Entwicklern eine Reihe von Komponenten, darunter Dienstregistrierung und -erkennung, Konfigurationscenter, Lastausgleich und Leistungsschalter usw., sodass Entwickler Mikrofunktionen erstellen können