[Spring]Spring框架和MVC原理
[Spring]Spring框架和MVC原理
2.1 Spring框架
Spring当前框架有20个jar包,大致可以分为6大模块:
- Core Container
- AOP and Instrumentation
- Messaging
- Data Access/Integration
- Web
- Test
Spring框架提供了非常丰富的功能,因此整个架构也很庞大。
在我们实际的应用开发中,并不一定要使用所有的功能,而是可以根据需要选择合适的Spring模块。
图-Spring框架图(官网文档)
2.1.1 Spring 关键策略
在介绍六大模块前,首先需要说明一下Spring的两大关键策略,这是Spring框架的基石。
也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。
控制反转主要有两方面:
- 依赖注入 (Dependency Injection),缩写为DI
- 依赖查找 (Dependency Lookup)
其中,依赖注入应用较为广泛。
容器全权负责的组件的装配,它会把符合依赖关系的对象通过JavaBean属性或者构造函数传递给需要的对象。
通过JavaBean属性注射依赖关系的做法称为设值方法注入(Setter Injection);将依赖关系作为构造函数参数传入的做法称为构造器注入(Constructor Injection)。
(2)面向切面编程 (Aspect Oriented Programming),缩写为AOP
利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2.1.2 核心容器 (Core Container)
IoC容器是Spring框架的核心。spring容器使用依赖注入管理构成应用的组件,它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更容易理解,也更容易重用和测试。
Spring自带了几种容器的实现,可归纳为两种类型:
(1)Bean工厂
由 org.springframework.beans.factory.BeanFactory 接口定义。
它是最简单的容器,提供基本的DI支持。
(2)应用上下文
由 org.springframework.context.ApplicationContext 接口定义。
它是基于BeanFactory 之上构建,并提供面向应用的服务,例如从属性文件解析文本信息的能力,以及发布应用事件给感兴趣的事件监听者的能力。
注:Bean工厂对于大多数应用来说往往太低级了,所以应用上下文使用更广泛。推荐在开发中使用应用上下文容器。
Spring自带了多种应用上下文,最可能遇到的有以下几种:
- ClassPathXmlApplicationContext——从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源。
- FileSystemXmlApplicationContext——读取文件系统下的XML配置文件并加载上下文定义。
- XmlWebApplicationContext——读取Web应用下的XML配置文件并装载上下文定义。
以下为加载应用上下文示例
ApplicationContext context2 = new ClassPathXmlApplicationContext("build.xml");
可以看到,加载 FileSystemXmlApplicationContext 和 ClassPathXmlApplicationContext 十分相似。
差异在于:前者在指定文件系统路径下查找build.xml文件;而后在所有类路径(包含JAR文件)下查找build.xml文件。
通过引用应用上下文,可以很方便的调用 getBean() 方法从 Spring 容器中获取 Bean。
2.1.3 AOP 和 Instrumentation
2.1.4 Messaging
2.1.5 数据访问与集成 (Data Access / Integaration)
2.1.6 Web
2.1.7 测试 (Test)
2.2 SpringMVC工作原理
本篇章重点讲述SpringMVC的基本工作原理,让大家进一步加深认识。
2.2.1 SpringMVC工作流程描述
(1)向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
(2)DispatcherServlet 根据 <servlet-name>-servlet.xml 中的配置对请求的URL进行解析,得到请求资源标识符(URI)。
然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以HandlerExecutionChain 对象的形式返回。
(3)DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(...)方法)。
(4)提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
- HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
- 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
- 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
- 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
(5)Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
(6)根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
(7)ViewResolver 结合Model和View,来渲染视图。
(8)视图负责将渲染结果返回给客户端。
参考资料
Spring官方文档——spring-framework-reference
http://blog.csdn.net/xtu_xiaoxin/article/details/8796499