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 );
<mark name=\"mark1\"/>
是索引标记。而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