当前位置: 首页 > wzjs >正文

怎样利用网站做推广网站解析后显示建设中

怎样利用网站做推广,网站解析后显示建设中,商贸公司,网站页面框架设计如何判断创建哪种web容器:servlet?reactive? 我们在启动Spring Boot程序的时候,会使用SpringApplication.run方法来启动,在启动流程中首先要判断的就是需要启动什么类型的服务器,是servlet?或者…

如何判断创建哪种web容器:servlet?reactive?

我们在启动Spring Boot程序的时候,会使用SpringApplication.run方法来启动,在启动流程中首先要判断的就是需要启动什么类型的服务器,是servlet?或者是reactive?那么spring boot是如何进行判断的呢?

根据上面的流程首先会判断出来要创建的web服务器的类型,然后通过spring.factories文件中的配置的ApplicationContextFactory实现,根据容器类型来创建出对应的容器:

  • reactive:AnnotationConfigReactiveWebServerApplicationContext;
  • servlet:AnnotationConfigServletWebServerApplicationContext;

上面已经创建出了对应的Spring容器,接下来就是要启动服务器来接收请求了,下面来看具体的流程:

我们假设创建的是reactive的容器,即AnnotationConfigReactiveWebServerApplicationContext。该类继承自ReactiveWebServerApplicationContext,该类中重写了生命周期中的onRefresh方法来创建一个WebServer

	@Overrideprotected void onRefresh() {super.onRefresh();try {createWebServer();}catch (Throwable ex) {throw new ApplicationContextException("Unable to start reactive web server", ex);}}

createWebServer()中完成的步骤就是一个:初始化WebServerManager

this.serverManager = new WebServerManager(this, webServerFactory, this::getHttpHandler, lazyInit);

初始化WebServerManager

从容器中获取ReactiveWebServerFactory

在容器中获取,首先需要容器中有ReactiveWebServerFactory的实现,经过查找发现是通过自动配置的方式将ReactiveWebServerFactory的实现加载到spring容器中的。我们查看autoconfiguration的配置发现有ReactiveWebServerFactoryAutoConfiguration自动配置类。

首先web服务需要是reactive类型的,然后通过@Import的方式我们看到加载了多种web服务器。通过打断点的方式,发现此处加载的NettyReactiveWebServerFactory,也就是最终生效的是EmbeddedNetty。这里创建的都是工厂类,还不是实际的web服务器,这里返回的是NettyReactiveWebServerFactory

从容器中获取HttpHandler

HttpHandler是spring处理http协议请求的顶级抽象接口,同样是从容器中获取的该接口的实现。我们还是查看自动配置类,发现HttpHandler的自动配置类是HttpHandlerAutoConfiguration。在自动配置类中通过WebHttpHandlerBuilder最终会创建出HttpHandler。下面看详细的创建流程:

初始化过程中,从容器中获取的WebHandler实现开始,在基础之上依次封装了:负责过滤器执行、负责处理异常、使用适配器将webHandler与httpHandler结合 这三种能力之后完成bean对象的创建。

从上面的流程可以看出,最原始的对象则是在容器中获得的名字为webHandler的实例。那么有没有呢,其实是有的:

上面的配置是在自动配置类WebFluxAutoConfiguration中完成的。

除此之外我们还应注意到的是在步骤2中的applicationContext方法注释:

上面的说明也明确了我们可以进行拓展的地方,比如可以实现WebFilter接口,将自己的过滤逻辑添加进程序的执行流程中。

此时我们得到了构造WebServerManager的主要参数,即有一个WebServerFactory还有一个HttpHandler。接下来就可以来创建WebServerManager对象了。

创建WebServerManager

因为是通过new的方式创建的对象,调用的是WebServerManager的构造器,查看构造器发现多了一个额外的逻辑:通过ReactiveWebServerFactory来创建webServer。接下来来看一下具体流程。

创建webServer

前面提到我们获得到的是NettyReactiveWebServerFactory工厂,通过getWebServer最终会创建出来一个netty服务器。详细的创建流程如下:

首先会通过Netty的HttpServer.create()方法创建出来一个HttpServer。然后就是将我们的httpHandler与netty的handler进行结合。

在netty中插入请求处理器的方式是调用handler方法:HttpServer.handle(this.handler),这里我们的传参就是上面第4步骤返回的适配器handler。这样当netty接收到请求的时候,会通过netty中的handler将请求代理到我们程序的处理逻辑中。

最终创建出来的是NettyWebServer对象,里面包含了Netty服务器、httpHandler和routeProviders。

启动NettyWebServer

上面创建好了Netty服务器,但是还没有启动它,需要把它添加到spring的生命周期中随着程序的启动同时启动web服务器。
spring boot中使用WebServerStartStopLifecycle来管理WebServer的生命周期。WebServerStartStopLifecycle实现了生命周期接口SmartLifecycle,监听到程序的启动start和停止stop。

getBeanFactory().registerSingleton("webServerStartStop",new WebServerStartStopLifecycle(this.serverManager));

总结

针对于reactive类型的Web容器,Spring Boot在启动的时候通过生命周期方法同时会启动Web服务器来接收请求。在使用Netty作为底层Web服务器的时候,通过handler适配器,将我们的业务逻辑处理流程与Netty的请求处理结合在一起,将请求的处理转入到Spring Boot的体系中。

不同的Web服务器的实现则只需要提供对应的适配器将handler进行结合,使请求能够通过适配器转入到Spring Boot的处理逻辑中即可。

我们简单看一下Tomcat服务器的创建代码:

	public WebServer getWebServer(HttpHandler httpHandler) {......// 创建Tomcat服务器实例Tomcat tomcat = new Tomcat();......Connector connector = new Connector(this.protocol);......// 使用Adapter将httpHandler嵌入到tomcat服务器中TomcatHttpHandlerAdapter servlet = new TomcatHttpHandlerAdapter(httpHandler);prepareContext(tomcat.getHost(), servlet);return getTomcatWebServer(tomcat);}

补充知识

WebHandler和HttpHandler的对比

功能WebHandlerHttpHandler
过滤器链支持支持(WebFilter不支持
异常处理支持(WebExceptionHandler不支持
会话管理支持(WebSession不支持
与 Spring WebFlux 集成高度集成手动集成
响应式上下文支持(Context不支持
高级请求/响应处理支持(ServerWebExchange手动实现


文章转载自:

http://eE7QRO0B.jcxqc.cn
http://iDdGTgbU.jcxqc.cn
http://JS3W5plP.jcxqc.cn
http://9a9uCBN7.jcxqc.cn
http://1HPADjx3.jcxqc.cn
http://Q8bKpSjH.jcxqc.cn
http://r1BATffZ.jcxqc.cn
http://ZONt8Rzj.jcxqc.cn
http://pydTgNav.jcxqc.cn
http://Io2d3y7Z.jcxqc.cn
http://38IcjeiM.jcxqc.cn
http://R4ALmsa0.jcxqc.cn
http://bYqAmYbn.jcxqc.cn
http://2q3pWYfK.jcxqc.cn
http://QKeWjjJ3.jcxqc.cn
http://ZeLEVfsD.jcxqc.cn
http://NFKXgSNT.jcxqc.cn
http://8uGsSXNu.jcxqc.cn
http://5cu7x5UG.jcxqc.cn
http://Y2WDzsUz.jcxqc.cn
http://4qE0yJvD.jcxqc.cn
http://rIpObBqN.jcxqc.cn
http://qzaln2gP.jcxqc.cn
http://7LXpd7Q3.jcxqc.cn
http://rRtAa0Fy.jcxqc.cn
http://5Daz2mos.jcxqc.cn
http://RdHBL8kG.jcxqc.cn
http://7f8A6MSF.jcxqc.cn
http://PY14t3C6.jcxqc.cn
http://CcypoKwE.jcxqc.cn
http://www.dtcms.com/wzjs/708937.html

相关文章:

  • 货代可以从哪些网站开发客户软件商店应用
  • 网站卡密怎么做广西建设网查询
  • 北京梦创义网站建设本地app制作公司
  • 浙江综合网站建设配件怎么建网站数据库
  • 辽宁省建设厅证书查询网站wordpress添加导航
  • 专业网站建设费用电商网站建设开发的语言有哪些
  • 公司网站怎么申请怎么注册wordpress文章不显示全文
  • 两学一做教育纪实评价系统网站电商购物网站
  • 哪里有学习做网站的专门的网页制作工具有
  • 游戏道具网站开发网站内部流程
  • 网站建实例网页制作创建站点
  • 网站开发的背景是指什么建设银行官方网站购房贷款利率
  • 晚上做设计挣钱的网站青海网站制作
  • 建设留学网站最牛html5网站建设
  • asp.net 登陆两个网站全网营销公司排名前十
  • 公司的网站建设费怎么入账临淄找工作信息网
  • 网站开发项目费用预算网站建设套餐介绍
  • 大型网站建设的主要问题网站上传文件不大于5M定么做
  • 网站后期的维护国外以紫色为背景的网站
  • 网站网页设计是什么商业网站的域名代码
  • 网站开发基础语言关键词优化需要从哪些方面开展?
  • 网站安全建设 应用开发建设一个自己的网站首页
  • 中英语双语网站咋做网站建设就是学淘宝吗
  • 北京网站建设怎么样天宁波江北建设局网站
  • 电商购物网站建设临沂网站建站专业公司
  • 如何修改网站关键词wordpress 发布 接口
  • 汕头网站推广优化微博内网站怎么做的
  • 做网站服务抖音代运营ppt
  • 网站虚拟服务器四川省住房和城乡建设厅厅长
  • 律师网站建设 优帮云wordpress静态首页怎么编辑