丨新特性tomcat和jetty如何处理springboot应用_第1页
丨新特性tomcat和jetty如何处理springboot应用_第2页
丨新特性tomcat和jetty如何处理springboot应用_第3页
丨新特性tomcat和jetty如何处理springboot应用_第4页
丨新特性tomcat和jetty如何处理springboot应用_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

既然要支持多种Web容器,SpringBoot对内嵌式WebpublicinterfaceWebServervoidstart()throwsvoidstop()throwsint5各种Web容器比如Tomcat和JettySpringBootServletWebServerFactoryWeb象就是上面提到的WebServer。publicinterfaceServletWebServerFactoryWebServergetWebServer(ServletContextInitializer...3可以看到publicinterfaceServletContextInitializervoidonStartup(ServletContextservletContext)throws3这里请注意,上面提到的getWebServer方调用ServletContextInitializer的onStartup方法,也就是说如果你想在Servlet容器启动时做一些事情,比如你自己的Servlet,可以实现一个ServletContextInitializer,在Web容器启动时,SpringBoot会ServletContextInitializeronStartup方法。为了支持对内嵌式Web容器的定制化,SpringBoot还定义了BeanPostProcessorpostProcessBeforeInitializationSpring中WebServerFactoryCustomizerBean,publicinterfaceWebServerFactoryCustomizer<TextendsWebServerFactory>voidcustomize(T3Web铺垫了这些接口,我们再来看看SpringBoot是如何实例化和启动一个Web容器的。我们知道,Spring的是一个ApplicationContext 实现了著名的refresh方法,它用来新建或者刷新一个ApplicationContext,在refresh方法中会调用onRefresh方法, ApplicationContext的子类可以重写这个方法onRefresh方法,来实现特定Context的刷新逻辑,因此ServletWebServerApplicationContext就是通过重写onRefresh方法来创建内嵌式的Web容器,具体创建过程是这样的:protectedvoidonRefresh()34try5//重写onRefresh方法,调用createWebServer创建和启动67}8catch(Throwableex)9}}//createWebServerprivatevoidcreateWebServer()//这里WebServer是SpringBoot抽象出来的接口,具体实现类就是不同的WebWebServerwebServer=ServletContextservletContext=//如果Webif(webServer==null&&servletContext==null)//通过WebServletWebServerFactoryfactory=//注意传入了一个this.webServer=factory.getWebServer(new}elseif(servletContext!=null)try}catch(ServletExceptionvar4)}}}getWebSeverTomcatTomcatAPIpublicWebServergetWebServer(ServletContextInitializer...initializers)//1.实例化一个Tomcat,可以理解为ServerTomcattomcat=new4//2.FilebaseDir=this.baseDirectory!=null?this.baseDirectory:8//3.Connectorconnector=new//4.创建定制版的"Context"this.prepareContext(tomcat.getHost(),return20prepareContextContextTomcatContext组件,为了方便控制Context组件的行为,SpringBoot定义了自己的TomcatEmbeddedContext,它扩展了Tomcat的StandardContext:1classTomcatEmbeddedContextextendsStandardContextServlet的三种方式Servlet在SpringBoot启动类上加上 ponentScan注解后 使用@WebServlet、@WebFilter、@WebListener标记的Servlet、Filter、Listener就可以自动到Servlet容器中,无需其他代码 publicclass@WebServlet(/opublicclassoServletextendsHttpServlet在Web应用的类上加 ponentScan,并且在Servlet类上加@WebServlet,这样SpringBoot会负责将Servlet到内嵌的Tomcat中同时SpringBoot也提供了ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean这三个类分别用来Servlet、Filter、Listener。假如要一个Servlet,可以这样做:publicServletRegistrationBeanservletRegistrationBean()returnnewServletRegistrationBean(newoServlet(),"/4这段代码实现的方法返回一个ServletRegistrationBean,并将它当作Bean到Spring中,因此你需要把这段代码放到SpringBoot自动扫描的中,或者放到@Configuration标识的类中。Bean,SpringBootonStartuppublicclassMyServletRegisterimplementsServletContextInitializer345publicvoidonStartup(ServletContextservletContext)67//Servlet3.0规范新的8ServletRegistrationmyServlet=9.addServlet("oServlet",myServlet.setInitParameter("name","o}}onStartupServletContext,可以通过调用它的addServlet方法来动态新的Servlet,这是Servlet3.0以后才有的功能。WebSpringBoot中定制Web容器。在Spring2.0Web第式是通过通用的Web容器工厂ConfigurableServletWebServerFactory,来定制一些Web容器通用的参数:publicclassMyGeneralCustomizerWebServerFactoryCustomizer<ConfigurableServletWebServerFactory>4 publicvoidcustomize(ConfigurableServletWebServerFactoryfactory)678}9第二种方式WebTomcatServletWebServerFactory定制。下面的例子里,我们给Tomcat增加一个Valve,这个Valve的功能是向请求头里添加traceid,用于分布式追踪。TraceValve的定义如下:classTraceValveextendsValveBasepublicvoidinvoke(Requestrequest,Responseresponse)throwsIOException,47Valvenext=if(null==next) 16

next.invoke(request,publicclassMyTomcatCustomizerWebServerFactoryCustomizer<TomcatServletWebServerFactory>4publicvoidcustomize(TomcatServletWebServerFactoryfactory)factory.addEngineValves(newTraceValve() 12今天我们学习了SpringBoot如何利用Web容器的API来启动Web容器、如何向Web容器Servlet,以及如何定制化Web容器,除了给Web容器配置参数,还可以增加或者修改Web容器本身的组件。我在文章中提到,通过ServletContextInitializer接口可以向Web容器Servlet,那ServletContextInitializer跟Tomcat中的ServletContainerInitializer有什么区别和联系不知道今天的内容你消化得如何?如果还有疑问,请大胆的在留言区提问,也欢迎你的课后思考和心得记录下来,与我和其他同学一起讨论。如果你觉得今天有所收获,欢迎你把它给你的朋友。 售卖。页面已增加防盗追踪,将依 上一 27|新特性:Tomcat如何支持异步言言老师,springboot中getWebServer方法的实现类不仅有tomcat,还有其

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论