Der Unterschied zwischen dem herkömmlichen Tomcat-Startdienst und dem in Springboot integrierten Tomcat-Startdienst (empfohlen)

Der Unterschied zwischen dem herkömmlichen Tomcat-Startdienst und dem in Springboot integrierten Tomcat-Startdienst (empfohlen)

Spring-Integration mit SpringMVC

  • Die web.xml-Konfiguration der Spring-Integration springmvc ist wie folgt. Tomcat lädt den Inhalt während des Startvorgangs in web.xml. ContextLoaderListener implementiert die ServletContextListener-Schnittstelle in Tomcat. Daher wird während des Startvorgangs des Tomcat-Containers der Spring-Container über ContextLoaderListener initialisiert und die durch classpath:spring/applicationContext-*.xml angegebene Spring-Konfigurationsdatei geladen. In dieser Konfigurationsdatei habe ich nur <context:component-scan base-package="org.com.yp"/> konfiguriert, was bedeutet, dass die Klassen unter dem Paket org.com.yp, einschließlich @Component @Controller@Service und anderen Anmerkungen, nach Bean-Registrierung gescannt werden.
  • Die Bean-Registrierung erfolgt durch das Laden von Bean-Definitionen über die Methode AbstractXmlApplicationContext.loadBeanDefinitions dieser Klasse.

Die in Spring geladene Bean-Definition wird von der Methode ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory() in der Methode org.springframework.context.ConfigurableApplicationContext#refresh geladen. Diese Methode ruft dann die Methode org.springframework.context.support.AbstractRefreshableApplicationContext#refreshBeanFactory auf, um eine Bean-Factory zu erstellen und die Bean-Definition zu laden.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
                             http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>Vom Archetyp erstellte Webanwendung</display-name>
  <Listener>
    <listener-Klasse>org.springframework.web.context.ContextLoaderListener</listener-Klasse>
  </listener>
  <!-- Spring-Container laden-->
  <Kontext-Parameter>
    <param-name>Kontextkonfigurationsstandort</param-name>
    <param-value>Klassenpfad:spring/applicationContext-*.xml</param-value>
  </Kontext-Param>
​
  <Servlet>
    <Servlet-Name>MVC-Dispatcher</Servlet-Name>
    <servlet-Klasse>org.springframework.web.servlet.DispatcherServlet</servlet-Klasse>
    <!-- Konfigurieren Sie die Konfigurationsdatei, die springMVC laden muss-->
    <Init-Parameter>
      <param-name>Kontextkonfigurationsstandort</param-name>
      <param-value>Klassenpfad:spring/spring-*.xml</param-value>
    </init-param>
  </servlet>
​
  <Servlet-Zuordnung>
    <Servlet-Name>MVC-Dispatcher</Servlet-Name>
    <!-- Stimmt standardmäßig mit allen Anfragen überein -->
    <URL-Muster>/</URL-Muster>
  </servlet-mapping>
</Web-App>

Wenn der Tomcat-Container gestartet wird und über den Pfad auf Ressourcen zugegriffen wird, wird die Methode org.springframework.web.servlet.HttpServletBean#init zum ersten Mal aufgerufen, und nachfolgende HTTP-Anfragen verwenden diese Methodenklasse nicht mehr. HttpServletBean implementiert die Spezifikation der Servlet-Schnittstelle, sodass beim Initialisieren und Ausführen der Browseranforderung über die Servlet-Schnittstelle die in der SpringMVC-Konfiguration definierte Ladeklasse aus dem Spring-Container geladen wird. Spring und SpringMVC sind übergeordnete und untergeordnete Container. Das Folgende ist die Init-Methode von HttpServletBean

öffentliche final void init() wirft ServletException {
		// Bean-Eigenschaften aus Initialisierungsparametern festlegen.
		PropertyValues ​​​​pvs = neue ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
		wenn (!pvs.isEmpty()) {
			versuchen {
				BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(dies);
				ResourceLoader resourceLoader = neuer ServletContextResourceLoader(getServletContext());
				bw.registerCustomEditor(Resource.class, neuer ResourceEditor(resourceLoader, getEnvironment()));
				initBeanWrapper(bw);
				bw.setPropertyValues(pvs, true);
			}
			Fang (BeansException Beispiel) {
				wenn (logger.isErrorEnabled()) {
					logger.error("Fehler beim Festlegen der Bean-Eigenschaften für Servlet '" + getServletName() + "'", Beispiel);
				}
				werfen ex;
			}
		}

        //Schließlich wird die Refresh-Methode des Containers org.springframework.context.ConfigurableApplicationContext#refresh aufgerufen.
        // Initialisieren Sie den SpringMVC-Container initServletBean();
	}
    }

Springboot startet den Container

  • Zum Starten von Springboot wird zuerst die Spring-Kontextumgebung (einschließlich der Bean-Factory) in der Methode org.springframework.boot.SpringApplication#run(java.lang.String...) von Springboot initialisiert. Anschließend wird die Methode ConfigurableApplicationContext#refresh im Spring-Container aufgerufen, um die Bean über die Methode org.springframework.boot.SpringApplication#refreshContext zu initialisieren.
  • In der Umgebung der Spring- und SpringMVC-Integration werden Bean-Definitionen in die Methode org.springframework.context.support.AbstractApplicationContext#obtainFreshBeanFactory geladen, während sie sich in Springboot in

org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors-Methode, in der die Bean-Definition über die Klasse ConfigurationClassPostProcessor geladen wird, die die Schnittstelle BeanDefinitionRegistryPostProcessor implementiert, die die Verarbeitung von Bean-Definitionen ermöglicht.

// Der BeanDefinitionRegistryPostProcessor im Spring ist eine Unterschnittstelle von BeanFactoryPostProcessor.
// Die Funktion von BeanFactoryPostProcessor besteht darin, die Methode postProcessBeanFactory() auszuführen, wenn die Bean-Definitionsinformationen geladen, aber nicht initialisiert wurden.
// Der BeanDefinitionRegistryPostProcessor wird vor dem BeanFactoryPostProcessor ausgeführt. Die Ausführungsreihenfolge ist im Quellcode definiert // org.springframework.context.support.PostProcessorRegistrationDelegate#invokeBeanFactoryPostProcessors()-Methode // BeanFactoryPostProcessor ist der Bean-Eigenschaftsverarbeitungscontainer der Bean Factory. Einfach ausgedrückt kann er alle Beandefinition-Daten (nicht instanziiert) in unserer Bean Factory verwalten und Eigenschaften nach Belieben ändern.
public void refresh() wirft BeansException, IllegalStateException {
        synchronisiert (this.startupShutdownMonitor) {
            Aktualisieren vorbereiten();
            
            //Holen Sie es und weisen Sie die Unterklasse an, die Bean-Factory zu initialisieren, um die Beans in den Cache zu laden. Die Spring MVC-Integration dient hier zum Initialisieren der Bean. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
            
            BeanFactory vorbereiten (BeanFactory);
​
            versuchen {
                postProcessBeanFactory(beanFactory);
​
                // Der Springboot-Container beginnt an dieser Stelle mit dem Laden und initialisiert die folgenden Bean-Namen
                //0 = "org.springframework.context.annotation.internalConfigurationAnnotationProcessor" =》Entsprechende ConfigurationClassPostProcessor-Klasse //1 = "org.springframework.context.annotation.internalAutowiredAnnotationProcessor" =》AutowiredAnnotationBeanPostProcessor
                //2 = "org.springframework.context.annotation.internalCommonAnnotationProcessor" =》CommonAnnotationBeanPostProcessor
                //3 = "org.springframework.context.event.internalEventListenerProcessor" = "EventListenerMethodProcessor
                //4 = "org.springframework.context.event.internalEventListenerFactory" = "DefaultEventListenerFactory
                // Rufen Sie den Postprozessor unserer Bean Factory auf. Laden Sie die Bean-Definition (keine Instanziierung), laden Sie den Scan-Pfad in der Startklasse über ConfigurationClassPostProcessor // Laden Sie dann den Pfad zur Bean invokeBeanFactoryPostProcessors(beanFactory);
​
                registerBeanPostProcessors(beanFactory);
​
                initMessageSource();
​
                initApplicationEventMulticaster();
​
                // Diese Methode wird auch von einer Unterklasse von Springboot implementiert, die Tomat auch von dieser Methode aus startet.
                beiAktualisieren();
​
                registerListeners();
​
                //Instanziieren Sie den Rest unserer Singleton-Beans.
                beendenBeanFactoryInitialisierung(beanFactory);
​
                // Abschließend wird der Container aktualisiert und das Aktualisierungsereignis veröffentlicht (Spring Cloud wird auch von hier aus gestartet)
                beendenAktualisieren();
            }
​
            Fang (BeansException Beispiel) {
                wenn (logger.isWarnEnabled()) {
                    logger.warn("Ausnahme bei Kontextinitialisierung aufgetreten - " +
                            "Aktualisierungsversuch wird abgebrochen: " + Beispiel);
                }
​
                // Zerstören Sie bereits erstellte Singletons, um hängende Ressourcen zu vermeiden.
                Bohnen zerstören();
​
                // Setzen Sie das Flag „Aktiv“ zurück.
                AbbrechenAktualisieren(Beispiel);
​
                //Ausnahme an Anrufer weiterleiten.
                werfen ex;
            }
​
            Endlich {
                // Setzt die allgemeinen Introspektions-Caches im Spring-Kern zurück, da wir
                // Metadaten für Singleton Beans werden möglicherweise nie mehr benötigt ...
                : ResetCommonCaches();
            }
        }
    }

Dies ist das Ende dieses Artikels über den Unterschied zwischen dem herkömmlichen Tomcat-Startdienst und dem in Springboot integrierten Tomcat-Startdienst. Weitere Informationen zum Unterschied zwischen dem Tomcat-Startdienst und dem in Springboot integrierten Tomcat-Startdienst finden Sie in den vorherigen Artikeln von 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, Sie werden 123WORDPRESS.COM auch in Zukunft unterstützen!

Das könnte Sie auch interessieren:
  • Detaillierte Erläuterung des Startprinzips des in SpringBoot integrierten Tomcat
  • So brechen Sie den integrierten Tomcat-Start in SpringBoot ab und verwenden stattdessen einen externen Tomcat
  • Eine kurze Diskussion über den Unterschied zwischen dem in Springboot integrierten Tomcat und der externen unabhängigen Bereitstellung von Tomcat
  • Tomcat meldet einen Fehler beim Starten des Springboot-Projekt-War-Pakets: Fehler beim Starten des untergeordneten
  • So starten Sie den Tomcat-Prozess in SpringBoot
  • Quellcodeanalyse des Prozesses zum Starten des integrierten Tomcat in der SpringBoot-Anwendung

<<:  PageSpeed ​​Optimierung im Überblick

>>:  Implementieren Sie eine MaterialUI-Button-Klickanimation auf Basis von CSS und kapseln Sie sie in eine React-Komponente ein.

Artikel empfehlen

MySQL-Protokolleinstellungen und Anzeigemethoden

MySQL verfügt über die folgenden Protokolle: Fehl...

jQuery implementiert alle Warenkorbfunktionen

Inhaltsverzeichnis 1. Alles auswählen 2. Erhöhen ...

MySQL Series 11-Protokollierung

Tutorial-Reihe MySQL-Reihe: Grundlegende Konzepte...

So verwenden Sie Filter zur Implementierung der Überwachung in Zabbix

Als ich kürzlich an Überwachungsgeräten arbeitete...

Beispiel für die Verwendung der in Vue integrierten Komponente „Keep-Alive“

Inhaltsverzeichnis 1. Verwendung von Keep-Alive A...

Der Ansichtsbereich im Meta-Tag steuert das Gerätebildschirm-CSS

Code kopieren Der Code lautet wie folgt: <meta...

Implementierung von FIFO in der Linux-Prozesskommunikation

FIFO-Kommunikation (First In First Out) FIFO-Name...

So kompilieren Sie Nginx neu und fügen Module hinzu

Beim Kompilieren und Installieren von Nginx werde...

Detaillierte Erläuterung des Ausführungsplans, Beispiel für einen Befehl in MySQL

Vorwort Der Befehl „Explain“ ist die primäre Mögl...

Reines CSS3 zum Erstellen eines Beispielcodes für Haushühner

Ich habe in letzter Zeit viel Wissen und Artikel ...

Implementierungsbeispiel für das Zurücksetzen des CSS-Reset-Stils

Einführung: Alle Browser verfügen über Standardst...

Detaillierte Erklärung der Semiotik in Html/CSS

Basierend auf Theorien wie Saussures Sprachphilos...

Das WeChat-Applet realisiert ein Verknüpfungsmenü

Um das Kursdesign zu realisieren, habe ich kürzli...