理解spring-mvc的最小化配置和工作原理

关于spring-mvc的最小化配置,可以参考文章:http://www.cnblogs.com/xing901022/p/5240044.html

关于配置中几个配置项之间的关系,可以参考文章:http://yjph83.iteye.com/blog/2302120

记录一下我读完后的理解:

  • web容器(比如:tomcat)启动后,会创建一个全局上下文:ServletContext,可以简单理解为一个k-v map。
  • web容器接着调用各种context listener,告知它们各种事件,比如web容器启动。
  • 其中contextLoaderListener监听了web容器启动事件,创建了一个根上下文XmlWebApplicationContext,存储到了ServletContext中,这个上下文就是全局的IOC容器,用于多个servlet间共享使用。
  • 接着web容器创建每一个servlet,我们只配置了一个DispatcherServlet,它实现了Servlet的标准协议,在初始化的时候它会再次创建一个xmlWebApplicationContext上下文,也就是另一个IOC容器,这个容器只能获取servlet范围的bean。
  • 每个servlet的上下文会关联到父级的上下文,这里每个servlet上下文的父级是指contextLoaderListener创建的上下文(存储在全局ServetContext的某个key下)。如果一个servlet在自己的上下文中无法获取某个bean,那么会尝试去父级上下文获取。
  • component-scan配置就是DispatcherServlet会去特定目录下扫描所有class,反射分析注解@controller,从而为每个controller类生成单例bean。

 

关于tomcat线程模型和servlet的线程安全关系:http://blog.csdn.net/lcore/article/details/8974590

总之,默认tomcat对servlet对象,springmvc对待各类bean(包括Controller等)都是单例的,多线程并发访问一定要注意。

按照上面的博客,我成功运行了springmvc,但是中途有一个地方需要注意:我使用idea开发环境,运行项目需要安装一个tomcat作为服务器,之后在idea中运行项目时一定要按下面的图示配置,否则tomcat默认并不会加载编译出来的war包,访问任何url都是404错误。

283E1C92-6147-4047-8B9A-287AE2735C8D

至于war和war explode的区别,前者是把java代码和各类静态资源都打包到一起给tomcat部署,后者是不打包直接把代码和各类静态资源的目录传给tomcat,后者可以支持热部署代码,也就是tomcat会检测目录内任何文件变化立即生效,适合开发环境,详情可以参考:http://stackoverflow.com/questions/1289358/what-does-exploded-development-mean-in-java

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~