SpringBoot是如何配置DispatcherServlet的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot是如何配置DispatcherServlet的相关的知识,希望对你有一定的参考价值。

参考技术A SpringMVC的核心入口就是DispatcherServlet,无论是通过web.xml 还是 JavaConfig的方式配置,都是要遵循Servlet规范的,即想要动态的添加配置一个Servlet本质上最终还是通过 ServletContext.addServlet() ,虽然有了SpringMVC一般很少有需要直接编写Servlet,但是对于理解原理还是很必要的

Servlet3提供了 ServletContainerInitializer 接口来支持动态的注册Servlet/Filter/Listener

spring-web模块里的 SpringServletContainerInitializer 实现并抽象出新的接口: WebApplicationInitializer

所以,它的存在基本替代web.xml配置,在初始化的时候注册并配置容器上下文,官方doc的示例:

SpringBoot没有选择hook到Servlet规范里的的生命周期,而是抽象出自己的接口来配置嵌入的容器,把Servlet/Filter/Listener这些变成Spring Bean一样去配置

ServletContainerInitializer 生命周期是归Servlet容器管理
ServletContextInitializer 他是Spring自己管理

SpringBoot应用一般都是embbed server,默认不会去走Servlet那一套,所以想配置Servlet就是通过 ServletContextInitializer 或者其子类来实现注册

创建嵌入的servlet容器的时候(默认tomcat),new TomcatWebServer()构造函数里执行了初始化initialize(),也就是日志里比较标志性的一行 Tomcat initialized with port(s): 8080 (http)

然后提交了异步的FutureTask,就是startStopExecutor.submit(new StartChild(children[i])),TomcatEmbeddedContext#start()的时候会执行他的 ServletContextInitializer 列表

ServletWebServerApplicationContext里有一个实现的ServletContextInitializer逻辑:

getServletContextInitializerBeans() 逻辑就是从BeanFactory里获取指定类型的Bean列表,当然这其中就包含了一个 DispatcherServletRegistrationBean ,这个Bean的配置是在 DispatcherServletAutoConfiguration 里配置的

如何在“speech-dispatcher”中使用索引标记?

【中文标题】如何在“speech-dispatcher”中使用索引标记?【英文标题】:How to use Index Marks in "speech-dispatcher"? 【发布时间】:2013-02-14 17:07:43 【问题描述】:

所以,类似主题的问题:“如何在语音调度程序中使用索引标记?”我听到很多关于它的消息,但找不到任何关于如何在 SPD_MODE_THREADED 中使用它的教程。主要问题是当您发送“SPEAK”命令时,您无法将数据模式更改为 SPD_DATA_SSML。而且我认为我做错了什么。所以,谁知道如何使用这个索引标记,教程也很容易接受。谢谢!

【问题讨论】:

【参考方案1】:

已解决,这是在speech-dispatcher中设置索引标记的方法:

pthread_mutex_lock( m_connection->ssip_mutex );

spd_execute_command_wo_mutex( m_connection, "SET SELF SSML_MODE on" );

spd_execute_command_wo_mutex( m_connection, "SPEAK" );

char * reply = spd_send_data_wo_mutex( m_connection, "<speak>Hello, <mark name=\"mark1\"/> how does it work?</speak>", SPD_NO_REPLY );
delete[] reply;

spd_execute_command_wo_mutex( m_connection, "\r\n." );

spd_execute_command_wo_mutex( m_connection, "SET SELF SSML_MODE off" );

pthread_mutex_unlock( m_connection->ssip_mutex );

&lt;mark name=\"mark1\"/&gt; 是索引标记。而mark1 是索引标记名称。

此文档对于低级语音调度程序通信非常有用:http://cvs.freebsoft.org/doc/speechd/ssip.html#Top

【讨论】:

以上是关于SpringBoot是如何配置DispatcherServlet的的主要内容,如果未能解决你的问题,请参考以下文章

配置 AEM CQ6 (author + publish + apache dispatcher + ubuntu )

Eclipse配置Struts2问题:ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndE

applicationContext.xml和dispatcher-servlet.xml的区别

Dispatcher 没有频道订阅者 - spring-cloud-stream-kafka

Spring MVC 配置文件dispatcher-servlet.xml 文件详解

如何在“speech-dispatcher”中使用索引标记?