最重要的话说在前面:本文旨在告诉大家使用内嵌的tomcat,用注解开发SpringMVC,用main函数启动项目所需要做的配置工作。
一 随意吧,标题怎么起都行
本文不适合初学者,适合对Spring开发有一定经验的人。每月收入-支出 >0 的大神,前方施工,也请调头!
本文目的
- 学会使用搭建注解开发的SpringMVC工程环境
- 弄清楚SpringMVC和Servlet的启动顺序
- 学会使用main函数启动Web应用
- 提供一个能跑起来的使用的基本工程(以便复用和定制)
本文暂时不提供过多的源码解析。有时间会提供一系列的个人对常用框架源码的理解的总结。
我们从理清楚几个概念的关系开始入手。
1 Spring和SpringMVC的关系是: SpringMVC是Spring的一部分。SpringMVC依赖Spring的core部分。见下图:
as we all know , 要用Spring,最起码要有Spring 的core部分。Spring core Container就是一个ApplicationContexxt实例。因为Spring framework是可以应用到web也可以应用到非web环境。用到Web环境时,站在整个Spring体系的角度来讲,绝大多数都只是用到了core部分和Web部分的Web、Servlet这两个小模块。只不过Web部分采用了MVC的设计模式,我们习惯把它Web部分称之为SpringMVC。
为了让Spring和SpringMVC之间有关联,但又不相互耦合。(Core可以无需Web,但Web必须依赖core), 设计者就告诉我们:当你要用springmvc时,Spring的core部分创建一个ApplicationContext实例,主要存放那些和web不相关的Bean。例如:@Service、@Repository、还有数据源等Bean。而 Spring的Web部分创建一个ApplicationContext实例,主要存放那些和web有相关的Bean。例如:@Controller、ViewResolver等Bean。见下图1
WebApplicationContext接口继承了ApplicationContext接口。所以在web环境下,实质上创建会创建两个WebApplicationContext对象(需要看源码才知道)。一个在语义上叫 Root WebApplicationContext,另一个叫 Servlet WebApplicaionContext。到这里,你一定想问一堆问题:为什么要把Bean分开放到两个容器中,这样一来Bean对象不就分离了吗。那么Controller要调用Service对象时,不就放到两个不同的容器里了吗?怎么还能取得到?要是我在开发中想获取WebApplicationContext,那我需不需要关注到底获取的是哪个WebApplicationContext,否则我怎么Bean分开存放之后,我通过context.getBean方法怎么拿得到? 以上的问题,其实就是一个问题:这两个WebApplicationContext对象会不会完全隔离?答案是不会。Servlet WebApplicationContext会委托(Delegates)Root WebApplicationContext查找bean,如果Servlet WebApplicationContext找不到bean的情况下。所以在这里是单向关联。源码暂不分析,不过给个简单的证明的办法:ApplicationContextAware接口有一个唯一的抽象方法。一个java实现类只要实现了这个接口,并且通过注解(或XML的<bean>标签配置) 声明为一个Bean,Spring启动过程中,会将创建好的ApplicationContext对象通过seApplicationContext 传入Bean对象。结合ApplicationContext的getParent方法,我们就可以通过以下代码测试并验证:到底有几个ApplicationContext对象,某个ApplicationContext对象中是否包含指定的Bean。
看到这里已经很清晰明了了,但我还是啰嗦一句:在web环境下,Spring会先创建Root WebApplicationContext,再创建Servlet WebApplicationContext对象。
可是还有一个问题,那到底用WebApplicationContext的哪个实现类来创建对象呢? 翻源码呗,我信你个鬼【抠鼻】!在没有任何经验的情况下,你就知道用哪个?别傻了。还是得靠经验或者从别人哪里学习得知。所以只好这么说,as we all know:
ClassPathXmlApplicationContext 这个实现类,是使用XML配置文件创建的ApplicationContext。AnnotationConfigWebApplicationContext类就是使用注解来来创建ApplicationContext对象的。呼~~,So,使用注解来开发SpringMVC就是要创建两个AnnotationConfigWebApplicationContext实例作为IOC容器。这时候,你可能在想,还等什么赶紧看下AnnotationConfigWebApplicationContext的构造函数吧!!! 别慌!
AnnotationConfigWebApplicationContext可以不用我们手动创建!
AnnotationConfigWebApplicationContext可以不用我们手动创建!
AnnotationConfigWebApplicationContext可以不用我们手动创建!
往下看!
2 SpringMVC和Servlet容器(本文是Tomcat)的关系是:SpringMVC有一个Servlet名字叫作DispatcherServlet,它被Servlet容器加载并初始化。SpringMVC会把自己的ROOT ApplicationContext对象放到Servlet容器的ServletContext作用域中。
先看SpringM