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

So stellen Sie LNMP und phpMyAdmin in Docker bereit

Umweltvorbereitung: Stellen Sie lnmp auf einem Ho...

So zeichnen Sie eine vertikale Linie zwischen zwei Div-Tags in HTML

Als ich kürzlich eine Schnittstelle zeichnete, st...

Praktische Methode zum Upgrade von PHP auf 5.6 unter Linux

1: Überprüfen Sie die PHP-Version nach dem Aufruf...

Detaillierte Erklärung, wie Tomcat asynchrone Servlets implementiert

Vorwort Durch meine vorherige Tomcat-Artikelserie...

So verbessern Sie die Sicherheit von Linux- und Unix-Servern

Netzwerksicherheit ist ein sehr wichtiges Thema u...

Installieren und Konfigurieren von MySQL unter Linux

System: Ubuntu 16.04LTS 1\Laden Sie mysql-5.7.18-...

Starten Sie alle gestoppten Docker-Container mit einem Befehl neu

Starten Sie alle gestoppten Docker-Container mit ...

SQL-Funktion zum Zusammenführen eines Feldes

Vor kurzem musste ich alle Felder einer verknüpft...

WeChat Mini-Programm Lotterienummerngenerator

In diesem Artikel wird der spezifische Code des W...

Beispiel für die Konfiguration der Timeout-Einstellung für MySQL-Datenbanken

Inhaltsverzeichnis Vorwort 1. JDBC-Timeout-Einste...