一文看懂spring+springmvc+mybaits

学了SSM与SSH框架,为了让自己巩固一下知识,在博客记录一下,以下纯属个人观点,各位大佬不喜勿喷。。谢谢!

SSM框架是由Spring+Mybatis+SpringMVC三大开源框架整合而成的,我们今天就简单介绍下三大框架。

Spring介绍

Spring 是 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 创建。Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。它解决了业务逻辑层和其他各层的松耦合问题,并将面向接口的编程思想贯穿整个系统应用。简单来说,Spring 是一个分层的 JavaSE/EE Full-Stack(一站式) 轻量级开源框架,JAVAEE经典的MVC三层架构中,Spring都给予了解决方案。

JAVAEE经典的MVC三层架构

  • 表现层(Controller):接受参数,封装参数,调用业务层逻辑,然后页面的跳转调度和数据显示。
  • 业务层(Service):负责业务逻辑处理,事务管理,功能逻辑等。
  • 持久层(Dao):负责数据的封装与存取,直接与数据库打交道。

Spring每一层都给予了解决方案:

  • 表现层(Controller):Struts1、Struts2、Spring MVC。
  • 业务层(Service):IOC(控制反转),AOP面向切面编程,事务管理。
  • 持久层(Dao):HibernateTemplate,JdbcTemplate,ORM框架(对象关系映射)。

Spring是轻量级框架:

完整的 Spring 框架可以在一个大小只有 1MB 多的 Jar 文件里发布。并且 Spring 所需的处理开销也是微不足道的。Spring 的出现解决了 EJB 臃肿、低效、繁琐复杂、脱离现实的情况。而且使用 Spring 编程是非侵入式的。Spring 应用中的对象不依赖于 Spring 的特定类。


Spring体系结构

Spring 框架是一个分层架构,被分为大约20个模块。这些模块分为Data Access/Integration、Web、AOP、Aspects、Instrumentation 、 Core Container和 Test。
一文看懂spring+springmvc+mybaits_第1张图片

Spring的三大核心

1.IOC(控制反转)

通俗易懂来说,让一个对象的创建不用 new 了,交给Spring去管理,可以自动的生产。

2. DI(依赖注入)

Spring 框架创建 Bean 对象时,动态地将依赖的对象注入到 Bean 组件。简单的说,就是将另外一个 Bean 对象动态地注入到另一个 Bean 中。

基本原理

利用了java的反射+工厂模式+配置文件。Spring在运行时,根据Spring的xml配置文件来动态的创建对象,和调用对象里的方法,控制权由对象本身转向容器。由容器根据配置文件去创建实例并创建各个实例之间的依赖关系 。
一文看懂spring+springmvc+mybaits_第2张图片

优点

  1. 我们只需要在使用的地方添加一个依赖即可,比如Resource/AutoWired注解等,或者xml里面配置依赖关系等。Spring就能把这些依赖对象注入进来,这样如果以后依赖了十几个对象,用的时候就不需要一个个set进去了。
  2. 方便层与层之间的解耦合,不需要自己去new对象,比如Spring容器创建Service,Dao对象,通过注解或配置将 Dao 传入 Servcie,那么 Service 对象就包含了 Dao 对象的引用。比如:
	@Service
    public class UserServiceImpl implements UserService {
    @Autowired //通过注解的方式注入UserDao对象
    private UserDao userDao;
    }

3.AOP(面向切面)

AOP 采取横向抽取机制,可以为某一类对象进行监督和控制,(也就是在调用这类对象的具体方法的前后去调用你指定的模块),从而达到对一个模块的扩充功能,对程序的扩展。

AOP的设计

AOP 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强。

  1. 每个Bean都会被JDK或者Cglib进行代理,取决于是否有接口
  2. 每个Bean会有多个“方法拦截器”,注意:拦截器有两层:外层由Spring内核控制流程,内层拦截器是用户设置的。也就是AOP
  3. 当代理方法被调用时,先经过外层拦截器,外层拦截器根据方法的各种信息判断该方法应该执行哪些“内层拦截器”,内层拦截器的设计就是职责链的设计。

AOP分析

1. 代理的创建

  1. 创建代理工厂,需要三个重要的信息,拦截器数组,目标对象接口数组,目标对象。
  2. 创建代理工厂时,会在拦截器数组尾部再添加一个默认拦截器 --用于最终的调用目标方法。
  3. 当调用getproxy()方法时,会根据接口数量大于0条件返回一个代理对象(JDK或者Cglib)。

2. 代理的调用

  1. 对代理对象进行调用时,会触发外层拦截器。
  2. 外层拦截器会根据代理的配置信息,创建内层拦截链,创建的过程中,会根据表达式判断当前拦截是否匹配到这个拦截器,而这个拦截链设计模式就是职业链模式。
  3. 当整个执行链执行到最后时,就会触发代理时那个尾部的默认拦截器,然后调用目标方法,最后返回。

题外话:其实Spring的事务也是基于AOP的设计,是一个拦截器。


SpringMVC

SpringMVC是什么?

SpringMVC和Struts2都是属于表现层的框架,它是Spring框架的一部分,也是基于 MVC 的设计理念,通过一套MVC注解,让POJO成为处理请求的控制器。SpringMVC 还支持 REST 风格的 URL 请求。此外,SpringMVC 在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现。它在框架设计、扩展性、灵活性等方面全面超越了 Struts、WebWork 等 MVC 框架,从原来的追赶者一跃成为 MVC 的领跑者。
DispatcherServlet前端控制器是整个SpringMVC框架的核心,负责职责分派。SpringMVC本身就是Spring的一个子项目,能与SpringIOC容器无缝整合,从而可以获得Spring的所有好处。

SpringMVC框架执行流程图

一文看懂spring+springmvc+mybaits_第3张图片

SpringMVC执行流程步骤

  1. 用户发送请求,被SpringMVC的前端控制器DispatcherServlet 拦截。
  2. DispatcherServlet收到请求之后调用HandlerMapping。
  3. HandlerMapping生成处理器执行链并返回给DispatcherServlet 。
  4. DispatcherServlet调用HandlerAdapter 。
  5. HandlerAdapter执行Handler,调用Controller(也叫后端控制器)。
  6. Controller将执行结果封装到ModelAndView ,并返回给HandlerAdapter 。
  7. HandlerAdapter 将 Controller 执行的结果 ModelAndView返回给DispatcherServlet 。
  8. DispatcherServlet将ModelAndView 发送给ViewResolver。
  9. ViewReslover 解析后返回具体的 View对象。
  10. DispatcherServlet 根据 View 对象进行渲染视图(即模型数据填充至视图中)。
  11. DispatcherServlet响应用户。

个人觉得SpringMVC的优点有如下几点:

 1. 实现restful的mvc,便于web开发。
 2. 大量的注解pojo,简化了xml配置。 
 3. 支持多种视图技术,最常见的JSP技术以及其它技术包括Velocity和FreeMarker 
 4. 能通过注解的方式返回JSON数据字符串。
 5. 是spring的子项目,能使用spring提供的其他一些功能。
 6. SpringMVC中提供一个DispatcherServlet, 无需额外开发。

MyBatis

MyBatis是什么?

MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。

由于MyBatis是直接基于JDBC做了简单的包装映射。

所以个人觉得从性能角度上看JDBC>MyBatis>Hibernate。

MyBatis架构

一文看懂spring+springmvc+mybaits_第4张图片

MyBatis架构说明:

  1. 配置文件:SqlMapConfig.xml为MyBatis全局核心配置文件,用于配置数据源,并引入mapper.xml映射文件。mapper.xml配置文件用于配置SQL语句,参数和封装结果集类型等。。
  2. SqlSessionFactory:由newSqlSessionFactoryBuilder().build(inputStream) 加载核心配置文件获得,inputStream是用来读取核心配置文件。作用是打开会话Sqlsession。
  3. SqlSession:是一个接口,调用api执行CRUD方法。
  4. Executor:是一个执行器,SqlSession调用CRUD操作的方法,从源码可以看到真正工作的是调用Excutor来执行CRUD操作。提供缓存的实现与数据库的实现。
  5. Mapped Statement:在映射文件里面进行配置,包含三个部分:具体执行的SQL语句,SQL执行所需要的参数类型,SQL执行结果的封装类型,参数类型和结果集封装类型。即HashMap,基本数据类型和Pojo。

个人觉得MyBatis的优点有如下几点:

 1. 较易上手
 2. xml标签支持动态sql语句
 3. 映射标签支持对象与数据库的orm字段关系映射。
 4. sql语句比较灵活,写在XML里面,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

下面是个人对SSM与SSH框架的对比,各位大佬不喜勿喷,谢谢!

SSM 框架与 SSH 框架比较,主要是 SpringMVC 和 Struts2,Mybatis 和 Hibernate 的对比。

SpringMVC与Struts2对比

1. SpringMVC 的入口是 Servlet。Struts2 的入口是 Filter。两者之间的实现机制不同。
2. SpringMVC比Struts2稍微快一些。因为SpringMVC是基于方法的设计,而Struts2是基于类上的设计。
3. 对于Struts2,客户每发一次请求都会实例化一个Action,每个Action都会被注入属性,而SpringMVC是基于方法的,相比粒度更加细。
4. Struts2是更加符合面向对象的思想,而SpringMVC则是在Serlvet上进行扩展。
### 个人觉得MyBatis的优点有如下几点:
 1. 较易上手
 2. xml标签支持动态sql语句
 3. 映射标签支持对象与数据库的orm字段关系映射。
 4. sql语句比较灵活,写在XML里面,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

MyBatis与Hibernate对比

1. 个人感觉Hibernate真正掌握是要比 Mybatis 难,Mybatis 框架相对来讲简单更容易上手。
2. Hibernate是对对象与关系映射提供了完整的解决方案,这样可以使我们不需要关系底层数据库系统的一些细节,而MyBatis需要用户自己对对象进行详细的管理。
3. MyBatis可以更加淋漓尽致的对SQL语句进行优化,查询的时候可以减少查询字段。
4. Hibernate比MyBatis的数据库移植性更加好,因为MyBatis对不同的数据库需要写不同的SQL语句。

写了差不多三天时间-。-!以上就是本人这几个月对框架学习的了解,各位大佬有啥意见的可以评论方留言,有错误的地方还需多多指点。谢谢各位!!

你可能感兴趣的:(ssm框架自我总结)