spring boot 2.0 | 怎样启动内置的tomcat

spring boot 2.0 | 怎样启动内置的tomcat

标签(空格分隔): springboot


本文讲解springboot2.0在什么时候和用什么方式启动的内置tomcat。
首先创建一个简单的maven模板工程

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.tamguo</groupId>
  <artifactId>tamguo-test</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  
  	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.0.3.RELEASE</version>
		<relativePath /> <!-- lookup parent from repository -->
	</parent>
	
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
	</dependencies>
	
</project>

boot-starter-web是包含了spring-web,spring-webmvc,spring-tomcat-start 和springboot启动的引导类。

然后在src下面创建一个java启动类

@SpringBootApplication
public class TamguoApplication {

	public static void main(String[] args) {
		new SpringApplicationBuilder(TamguoApplication.class).run(args);
	}
	
}

@SpringBootApplication 它包括三个注解:

@Configuration:表示将该类作用springboot配置文件类。
@EnableAutoConfiguration:表示程序启动时,自动加载springboot默认的配置。
@ComponentScan:表示程序启动是,自动扫描当前包及子包下所有类。

启动项目我们关注下项目日志

2018-08-29 11:55:10.127  INFO 51996 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''

找到类TomcatWebServer

    private void initialize() throws WebServerException {
    		TomcatWebServer.logger
    				.info("Tomcat initialized with port(s): " + getPortsDescription(false));
    		synchronized (this.monitor) {
    			try {
    				addInstanceIdToEngineName();
    
    				Context context = findContext();
    				context.addLifecycleListener((event) -> {
    					if (context.equals(event.getSource())
    							&& Lifecycle.START_EVENT.equals(event.getType())) {
    						// Remove service connectors so that protocol binding doesn't
    						// happen when the service is started.
    						removeServiceConnectors();
    					}
    				});
    
    				// Start the server to trigger initialization listeners
    				this.tomcat.start();
    
    				// We can re-throw failure exception directly in the main thread
    				rethrowDeferredStartupExceptions();
    
    				try {
    					ContextBindings.bindClassLoader(context, context.getNamingToken(),
    							getClass().getClassLoader());
    				}
    				catch (NamingException ex) {
    					// Naming is not enabled. Continue
    				}
    
    				// Unlike Jetty, all Tomcat threads are daemon threads. We create a
    				// blocking non-daemon to stop immediate shutdown
    				startDaemonAwaitThread();
    			}
    			catch (Exception ex) {
    				stopSilently();
    				throw new WebServerException("Unable to start embedded Tomcat", ex);
    			}
    		}
    	}

看到this.tomcat.start();就是启动tomcat了。它是在刷新spring容器执行的启动tomcat。

    @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) {
    				if (logger.isWarnEnabled()) {
    					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;
    			}
    
    			finally {
    				// Reset common introspection caches in Spring's core, since we
    				// might not ever need metadata for singleton beans anymore...
    				resetCommonCaches();
    			}
    		}
    	}

onRefresh()方法启动tomcat

探果网

posted @ 2018-08-29 12:27  谭果  阅读(896)  评论(0)    收藏  举报