SSM框架是由三套框架整合起来的。分别是 Spring、Spring MVC、Mybatis。
Spring是一个控制反转(IoC)和面向切面(AOP)的容器框架,适用于任何Java应用。
控制反转(IoC)是指对象的创建权交给Spring容器,其作用是实现了程序的解耦合,对象创建的控制权不是使用者,而是框架或者容器。例如:想要调用类里面一个非静态方法,首先要通过 new 实例化一个对象,然后通过这个实例调用相关的方法 method。但是在 Spring 中,Spring 创建对象的过程,不是在代码里面实现的,而是交给 Spring 来进行配置实现的,其基本原理就是 XML配置文件+SAX解析+工厂设计模式;
OOP技术,允许开发者定义纵向的关系,但并不适合定义横向的关系。AOP技术,将那些影响了多个类的公共行为封装到一个可复用模块,这个就是所谓的切面(Aspect)。切面是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。最常见的使用到AOP技术就是日志功能。
- 连接点(
Joinpoint):被拦截到的点可能是字段、构造器、或者方法。Spring只支持方法类型的连接点。 - 横切关注点:对哪些方法进行拦截,拦截后怎么处理,称之为横切关注点。
- 切面(
aspect):类是对物体特征的抽象,切面就是对横切关注点的抽象。 - 切入点(
pointcut):对连接点进行拦截的定义。 - ֪ͨ(
advice):指拦截到连接点之后要执行的代码。通知分为前置、后置、异常、最终、环绕通知五类。 - 目标对象:代理的目标对象。
- 织入(
weave):将切面应用到目标对象并导致代理对象创建的过程。 - 引入(
introduction):在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段。
Spring中AOP代理由Spring的IoC容器负责生成、管理,其依赖关系也由IoC容器负责管理。因此AOP代理可以直接使用容器中的其它bean实例作为目标,这种关系可由IoC容器的依赖注入提供。
Spring创建代理的规则:
- 默认使用
Java动态代理来创建AOP代理,可以为任何接口实例创建代理 - 当需要代理的类不是代理接口的时候,
Spring会切换为使用CGLIB代理,也可强制使用CGLIB代理。
Spring MVC是Spring提供的一个强大而灵活的web框架。借助于注解,Spring MVC提供了几乎是POJO的开发模式,使得控制器的开发和测试更加简单。这些控制器一般不直接处理请求,而是将其委托给Spring上下文中的其他bean,通过Spring的依赖注入功能,这些bean被注入到控制器中。
Spring MVC主要由DispatcherServlet、处理器映射、处理器(控制器)、视图解析器、视图组成。他的两个核心是两个核心:
1. 处理器映射:选择使用哪个控制器来处理请求。 2. 视图解析器:选择结果应该如何渲染。 Spring MVC 主要有四个接口,DispatcherServlet接口、HandlerMapping接口、Controller接口、ViewResolver接口。
DispatcherServlet接口:所有的请求都有经过它来统一分发。他将请求分发给Spring Controller之前,需要借助于Spring提供的HandlerMapping定位到具体的Controller。HandlerMapping接口:完成客户请求到Controller映射。Controller接口:用于处理用户请求。Controller处理完用户请求,返回ModelAndView对象给DispatcherServlet前端控制器,ModelAndView中包含了模型(Model)和视图(View)。ViewResolver接口:Spring提供的视图解析器(ViewResolver)在Web应用中查找View对象,从而将相应结果渲染给客户。
DispatcherServlet
DispatcherServlet是Web应用的控制器,是Spring MVC的核心。它负责接收HTTP请求组织协调Spring MVC的各个组成部分。
- 截获符合特定格式的
URL请求。 - 初始化
DispatcherServlet上下文对应WebApplicationContext,并将其与业务层、持久化层的WebApplicationContext建立关联。 - 初始化
Spring MVC的各个组成组件,并装配到DispatcherServlet中。
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架(ORM框架)。MyBatis尽可能消除JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。