时间:2023-07-15 05:30:01 | 来源:网站运营
时间:2023-07-15 05:30:01 来源:网站运营
Tomcat 的工作原理万字总结,这回终于搞懂了!:SpringBoot 就像一条巨蟒,慢慢缠绕着我们,使我们麻痹。不得不承认,使用了 SpringBoot 确实提高了工作效率,但同时也让我们遗忘了很多技能。刚入社会的时候,我还是通过 Tomcat 手动部署 JavaWeb 项目,还经常对 Tomcat 进行性能调优。除此之外,还需要自己理清楚各 Jar 之间的关系,以避免 Jar 丢失和各版本冲突导致服务启动异常的问题。到如今,这些繁琐而又重复的工作已经统统交给 SpringBoot 处理,我们可以把更多的精力放在业务逻辑上。但是,清楚 Tomcat 的工作原理和处理请求流程和分析 Spring 框架源码一样的重要。至少面试官特别喜欢问这些底层原理和设计思路。希望这篇文章能给你一些帮助。
org.apache.coyote
。对应的结构图如下org.apache.coyote
。对应的结构图如下<?xml version="1.0" encoding="UTF-8"?><Server port="8005" shutdown="SHUTDOWN"> <Service name="Catalina"> <!-- 连接器监听端口是 8080,默认通讯协议是 HTTP/1.1 --> <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> <!-- 名字为 Catalina 的引擎,其默认的虚拟主机是 localhost --> <Engine name="Catalina" defaultHost="localhost"> <!-- 名字为 localhost 的虚拟主机,其目录是 webapps--> <Host name="localhost" appBase="webapps" unpackWARs="true" autoDeploy="true"> </Host> </Engine> </Service></Server>
SpringApplication.run
从 run 方法点进去,找到刷新应用上下文的方法。this.prepareContext(context, environment, listeners, applicationArguments, printedBanner);this.refreshContext(context);this.afterRefresh(context, applicationArguments);
从 refreshContext 方法点进去,找 refresh 方法。并一层层往上找其父类的方法。this.refresh(context);
在 AbstractApplicationContext 类的 refresh 方法中,有一行调用子容器刷新的逻辑。this.postProcessBeanFactory(beanFactory);this.invokeBeanFactoryPostProcessors(beanFactory);this.registerBeanPostProcessors(beanFactory);this.initMessageSource();this.initApplicationEventMulticaster();this.onRefresh();this.registerListeners();this.finishBeanFactoryInitialization(beanFactory);this.finishRefresh();
从 onRefresh 方法点进去,找到 ServletWebServerApplicationContext 的实现方法。在这里终于看到了希望。protected void onRefresh() { super.onRefresh(); try { this.createWebServer(); } catch (Throwable var2) { throw new ApplicationContextException("Unable to start web server", var2); }}
从 createWebServer 方法点进去,找到从工厂类中获取 WebServer的代码。if (webServer == null && servletContext == null) { ServletWebServerFactory factory = this.getWebServerFactory(); // 获取 web server this.webServer = factory.getWebServer(new ServletContextInitializer[]{this.getSelfInitializer()});} else if (servletContext != null) { try { // 启动 web server this.getSelfInitializer().onStartup(servletContext); } catch (ServletException var4) { throw new ApplicationContextException("Cannot initialize servlet context", var4); }}
从 getWebServer 方法点进去,找到 TomcatServletWebServerFactory 的实现方法,与之对应的还有 Jetty 和 Undertow。这里配置了基本的连接器、引擎、虚拟站点等配置。public WebServer getWebServer(ServletContextInitializer... initializers) { Tomcat tomcat = new Tomcat(); File baseDir = this.baseDirectory != null ? this.baseDirectory : this.createTempDir("tomcat"); tomcat.setBaseDir(baseDir.getAbsolutePath()); Connector connector = new Connector(this.protocol); tomcat.getService().addConnector(connector); this.customizeConnector(connector); tomcat.setConnector(connector); tomcat.getHost().setAutoDeploy(false); this.configureEngine(tomcat.getEngine()); Iterator var5 = this.additionalTomcatConnectors.iterator(); while(var5.hasNext()) { Connector additionalConnector = (Connector)var5.next(); tomcat.getService().addConnector(additionalConnector); } this.prepareContext(tomcat.getHost(), initializers); return this.getTomcatWebServer(tomcat);}
o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8900 (http)o.apache.catalina.core.StandardService : Starting service [Tomcat]org.apache.catalina.core.StandardEngine : Starting Servlet Engine: Apache Tomcat/8.5.34o.a.catalina.core.AprLifecycleListener : The APR based Apache Tomcat Native library which allows optimal ...o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContexto.s.web.context.ContextLoader : Root WebApplicationContext: initialization completed in 16858 ms
作者:ITDragon龙
链接:https://www.cnblogs.com/itdragon/p/13657104.html
来源:cnblogs
作者:zxl_Dragon最后,照旧安利一波我们的公众号:「终端研发部」,目前每天都会推荐一篇优质的技术相关的文章,主要分享java相关的技术与面试技巧,我们的目标是: 知道是什么,为什么,打好基础,做好每一点!这个主创技术公众号超级值得大家关注。
原文链接:https://blog.csdn.net/zxl_Dragon/article/details/83584667
来源:csdn
关键词:总结,工作,原理