Dieser Artikel analysiert die Forschung zum IOC-Quellcode beim Start von Spring Web
Um IOC zu studieren, erstellen Sie zunächst ein einfaches Webprojekt im Web.xml Wir werden hinzufügen Der Satz
<context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:applicationContext.xml</param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
bedeutet, dass der Webcontainer beim Start zuerst in die ContextLoaderListener-Klasse eintritt und dann geladen wird it. applicationContext.xml-Datei im Klassenpfad. Dann liegt der Fokus auf ContextLoaderListener. Klicken Sie auf den Open-Source-Code:
/** * Initialize the root web application context. */ @Override public void contextInitialized(ServletContextEvent event) { initWebApplicationContext(event.getServletContext()); } /** * Close the root web application context. */ @Override public void contextDestroyed(ServletContextEvent event) { closeWebApplicationContext(event.getServletContext()); ContextCleanupListener.cleanupAttributes(event.getServletContext()); }
, der hauptsächlich zwei Implementierungsmethoden der ServletContextListenerSchnittstelle enthält . Der Webcontainer ruft zuerst die contextInitialized-Methode auf, übergibt die von Tomcat gekapselten Containerressourcen und ruft dann die Initialisierungscontainermethode der übergeordneten Klasse auf.
/*** The root WebApplicationContext instance that this loader manages.*/private WebApplicationContext context;public WebApplicationContext initWebApplicationContext(ServletContext servletContext) { ...........省略// Store context in local instance variable, to guarantee that // it is available on ServletContext shutdown. if (this.context == null) { this.context = createWebApplicationContext(servletContext); } if (this.context instanceof ConfigurableWebApplicationContext) { ConfigurableWebApplicationContext cwac = (ConfigurableWebApplicationContext) this.context; if (!cwac.isActive()) { // The context has not yet been refreshed -> provide services such as // setting the parent context, setting the application context id, etc if (cwac.getParent() == null) { // The context instance was injected without an explicit parent -> // determine parent for root web application context, if any. ApplicationContext parent = loadParentContext(servletContext); cwac.setParent(parent); } configureAndRefreshWebApplicationContext(cwac, servletContext); } } servletContext.setAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE, this.context); ClassLoader ccl = Thread.currentThread().getContextClassLoader(); if (ccl == ContextLoader.class.getClassLoader()) { currentContext = this.context; } else if (ccl != null) { currentContextPerThread.put(ccl, this.context); } ......省略 return this.context; }
Der Hauptschritt in dieser Methode ist die Methode createWebApplicationContext, die zum Erstellen des Stammcontainers von XmlWebApplicationContext verwendet wird, der aus servletContextEvent übernommen wird.
Die Methode „loadParentContext“ wird zum Laden des übergeordneten Containers verwendet. Die Hauptmethode configureAndRefreshWebApplicationContext wird zum Konfigurieren und Aktualisieren des Root-Containers verwendet. Die wichtigste Methode innerhalb der Methode ist die Refresh-Methode, die die wichtigsten Funktionen implementiert.
@Override public void refresh() throws BeansException, IllegalStateException { synchronized (this.startupShutdownMonitor) { // Prepare this context for refreshing. prepareRefresh(); // Tell the subclass to refresh the internal bean factory. ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory(); // Prepare the bean factory for use in this context. prepareBeanFactory(beanFactory); try { // Allows post-processing of the bean factory in context subclasses. postProcessBeanFactory(beanFactory); // Invoke factory processors registered as beans in the context. invokeBeanFactoryPostProcessors(beanFactory); // Register bean processors that intercept bean creation. registerBeanPostProcessors(beanFactory); // Initialize message source for this context. initMessageSource(); // Initialize event multicaster for this context. initApplicationEventMulticaster(); // Initialize other special beans in specific context subclasses. onRefresh(); // Check for listener beans and register them. registerListeners(); // Instantiate all remaining (non-lazy-init) singletons. finishBeanFactoryInitialization(beanFactory); // Last step: publish corresponding event. finishRefresh(); } catch (BeansException ex) { logger.warn("Exception encountered during context initialization - cancelling refresh attempt", ex); // Destroy already created singletons to avoid dangling resources. destroyBeans(); // Reset 'active' flag. cancelRefresh(ex); // Propagate exception to caller. throw ex; } } }
Die PrepareRefresh-Methode wird verwendet, um die Umgebung vorzubereiten, die später verwendet wird.
obtainFreshBeanFactory-Methode ruft die beanFactory ab
@Override protected final void refreshBeanFactory() throws BeansException { if (hasBeanFactory()) { destroyBeans(); closeBeanFactory(); } try { DefaultListableBeanFactory beanFactory = createBeanFactory(); beanFactory.setSerializationId(getId()); customizeBeanFactory(beanFactory); loadBeanDefinitions(beanFactory); synchronized (this.beanFactoryMonitor) { this.beanFactory = beanFactory; } } catch (IOException ex) { throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex); } }
Die tatsächlich zurückgegebene beanFactory ist ihre Implementierungsklasse DefaultListableBeanFactory, die zum späteren Laden instanziiert wird. Klasse instanziiert im XML.
loadBeanDefinitions ist eine wichtige Methode, die zum tatsächlichen Laden der Klasse verwendet wird. Die vorherigen waren alles Vorbereitungsarbeiten.
Das obige ist der detaillierte Inhalt vonAnalysieren Sie den IOC-Quellcode, wenn Spring Web startet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!