前言:简单的来说,我们可以将Spring Boot看做一个启动、配置、快速开发的辅助框架,其本身针对的则是微服务。Spring Boot只是为了提高我们的开发效率,是为了提升生产力,但是在一个web项目的开发当中,MVC的开发模式还是必不可少的。


目录

一、Spring

二、Spring MVC

三、Mybatis

四、总结


SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。

一、Spring

Spring 是一个分层的 JavaSE/EE Full-Stack(一站式) 轻量级开源框架。经典的 MVC 三层结构为表现层、业务层、持久层,Web表现层负责页面数据显示、页面跳转调度,例如 JSP/Servlet、SpringMVC;Service业务层负责业务处理、功能逻辑和事务控制,例如 Service、JavaBean、EJB;而持久层Dao则负责数据存取和封装,及与数据库打交道,例如 JDBC、Hibernate、Mybatis

Spring的一站式则是指JavaEE的每层都提供了解决方案,

  • 表现层:Struts1、Struts2、Spring MVC;
  • 业务层:IoC 控制反转、AOP 面向切面编程、事务控制;
  • 持久层:JdbcTemplate、HibernateTemplate、ORM 框架(对象关系映射)的整合。

Spring的轻量级则是从大小和开销两部分来说的。一个完整的Spring框架可以在很小的Jar包里进行发布,其所需要的处理开销也是很小的,spring的出现解决了EJB 的繁琐复杂、脱离现实的缺点。

Spring框架是一个为Java应用程序的开发提供了综合、广泛的基础性支持的Java平台。框架本身是按照设计模式构建,这使得我们可以在开发环境中安心的集成Spring框架,不必担心Spring是如何在后台进行工作的。

1、Spring的结构体系

Spring框架至今已集成了20多个模块。这些模块主要包括核心容器、数据访问/集成,、Web、AOP(面向切面编程)、工具、消息和测试模块。

 

核心容器(Core Container)包括 Core、Beans、Context、EL 模块。

  • Core 和 Beans 模块提供了 Spring 最基础的功能,Core 模块是核心,为其他模块提供支持,包括 Spring 的核心工具类。Beans 是 Spring 管理实体类 Bean 的主要模块,提供 IoC 控制反转和依赖注入 DI。控制反转即将控制权由原来的程序员自己管理交给 Spring 来管理,依赖注入就是注入对象实例,有四种方式,即接口注入、setter 方法注入、构造器注入和注解注入。

  • Context 上下文模块,主要基于 Core 和 Beans 模块,Context 模块的 Context 包继承了 Beans 包的功能,还增加了国际化(I18N)、事件传播等,Context 上下文模块,还包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。

  • Expression Language,表达式语言模块,又称 SpEL,提供了在运行期间查询和操作对象图的强大能力。包含五个主要特性:(1)使用 Bean 的 ID 引用 Bean;(2)调用方法和访问对象的属性;(3)对值进行算术,关系和逻辑运算;(4)正则表达式匹配;(5)集合操作。

2、Spring 的三大核心

Spring 的三大核心分别为 IOC(Inverse of Control 控制反转)、DI(Dependency Injection,依赖注入)和AOP(Aspect Oriented Programming 面向切面编程)。

    1、IOC(Innverse Of Controller控制反转)

//IOC,即将创建对象的权利交给Spring工厂管理
Content content  = new Content();
//现在可以这样去写
Content content = ContentFactory.getContent();

 2、DI(Dependency Injection,依赖注入)

DI 是指在 Spring 框架创建 Bean 对象时,动态地将依赖对象注入到 Bean 组件。简单的说,就是将一个 Bean 对象动态地注入到另一个 Bean 中。DI 的做法是:由 Spring 容器创建 Service、Dao 对象,并且通过注解或配置将 Dao 传入 Servcie,那么 Service 对象就包含了 Dao 对象的引用。比如:

@Service
public class UserServiceImpl implements UserService {
    @Autowired //通过注解注入UserMapper对象
    private UserMapper userMapper;

}

3、AOP(Aspect Oriented Programming 面向切面编程)

AOP 采取横向抽取机制,取代了传统纵向继承体系重复性代码的编写方式(例如性能监视、事务管理、安全检查、缓存、日志记录等)。AOP 基于代理思想,对原来目标对象,创建代理对象,在不修改原对象代码情况下,通过代理对象,调用增强功能的代码,从而对原有业务方法进行增强。例如可以在插入 User 对象之前进行打印日志,请看下面的代码示例。

//UserService.java
public interface UserService {

    void add(User user);
}
//前置增强类 PrintLogBefore.java
//前置增强代码
public class PrintLogBefore implements MethodBeforeAdvice {

    private static final Logger log = Logger.getLogger(PrintLogBefore.class);

    @Override
    public void before(Method method, Object[] arguments, Object target)
            throws Throwable {

        log.info("在插入User之前执行的方法");

    }

}
//最后配置切入点
<bean id="printBefore" class="dreamland.aop.test.PrintLogBefore"></bean>
<aop:config>
   <aop:pointcut expression="execution(public void save(dreamland.aop.entity.User))" id="pointcut"/>         
   <aop:advisor advice-ref="printBefore" pointcut-ref="pointcut"/>
</aop:config>

二、Spring MVC

Spring MVC属于SpringFrameWork的后续产品,Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的MVC 架构,从而在使用Spring进行WEB开发时,可以选择使用Spring的Spring MVC框架或集成其他MVC开发框架(struts2)。Spring框架是高度可配置的,而且包含多种视图技术,例如jsp等。Spring MVC分离了控制器、模型对象、过滤器以及处理程序对象的角色,这样的分离使得我们更加容易的去定制。

SpringMVC 通过一套 MVC 注解,让 POJO 成为处理请求的控制器,无需任何接口,同时,SpringMVC 还支持 REST 风格的 URL 请求。此外,SpringMVC 在数据绑定、视图解析、本地化处理及静态资源处理上都有许多不俗的表现。它在框架设计、扩展性、灵活性等方面全面超越了 Struts、WebWork 等 MVC 框架,从原来的追赶者一跃成为 MVC 的领跑者。

SpringMVC 框架围绕 DispatcherServlet 这个核心展开,DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处。

1、Spring MVC核心组件

  • DispatcherServlet:前端控制器,负责调度其他组件的执行,可降低不同组件之间的耦合性,Spring MVC 的核心模块。
  • Handler:处理器,完成具体的业务逻辑。
  • HandlerMapping:DispatcherServlet 是通过 HandlerMapping 将请求映射到不同的 Handler。
  • HandlerInterceptor:处理器拦截器,是一个接口,如果需要完成一些拦截处理,可以实现该接口。
  • HandlerExecutionChain:处理器执行链,包括两部分内容,Handler 和 HandlerInterceptor。
  • HandlerAdapter:处理器适配器,它可以完成执行业务逻辑之前的一些预处理,数据类型转换、封装等。 DispatcherServlet通过 HandlerAdapter 调⽤不同的 Handler。
  •  ModelAndView:装载了模型数据和视图信息,作为 Hanlder 的处理结果,返回给DispatcherServlet。
  •  ViewResolver:视图解析器,DispatcherServlet 通过它将逻辑视图转换成物理视图,最终将渲染结果响应给客户端

2、Spring MVC 框架流程

  1. 客户端请求被 DispatcherServlet 接收。
  2. 根据 HandlerMapping 映射到 Handler。
  3. 创建 Handler 和 HandlerInterceptor。
  4. Handler 和 HandlerInterceptor 以 HandlerExecutionChain 的形式一并返回给DispatcherServlet。
  5. DispatcherServlet 通过 HandlerAdapter 调用 Handler 的方法完成业务逻辑处理。
  6. 返回一个 ModelAndView 对象给 DispatcherServlet。
  7. DispatcherServlet 将获取的 ModelAndView 对象传给 ViewResolver ,将逻辑视图解析为物理理视图View。
  8. ViewResolver 返回⼀一个 View 给 DispatcherServlet。
  9.  DispatcherServlet 根据 View 进⾏行视图渲染(将模型数据填充到视图中)。
  10. DispatcherServlet 将渲染后的视图响应给客户端。

三、Mybatis

MyBatis 是支持普通 SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。MyBatis 使用简单的 XML或注解用于配置和原始映射,将接口和 Java 的POJOs(Plain Ordinary Java Objects,普通的 Java对象)映射成数据库中的记录。

每个MyBatis应用程序主要都是使用SqlSessionFactory实例的,一个SqlSessionFactory实例可以通过SqlSessionFactoryBuilder获得。SqlSessionFactoryBuilder可以从一个xml配置文件或者一个预定义的配置类的实例获得。

用xml文件构建SqlSessionFactory实例是非常简单的事情。推荐在这个配置中使用类路径资源(classpath resource),但你可以使用任何Reader实例,包括用文件路径或file://开头的url创建的实例。MyBatis有一个实用类----Resources,它有很多方法,可以方便地从类路径及其它位置加载资源。

MyBatis有以下的特点:

  • 支持自定义 SQL、存储过程、高级映射;
  • 实现自动对 SQL 的参数设置;
  • 实现自动对结果集进行解析和封装;
  • 通过 XML 或者注解进行配置和映射,大大减少代码量;
  • 数据源的连接信息通过配置文件进行配置

1、Mybatis 整体架构

  • 配置文件:全局配置文件 mybatis-config.xml,其作用为配置数据源,引入映射文件 Mapper.xml,映射文章的作用是配置 SQL 语句、参数、结果集封装类型等。
  • SqlSessionFactory:相当于 Hibernate 的 SessionFactory,作用为获取 SqlSession,通过 newSqlSessionFactoryBuilder().build(inputStream) 来构建,inputStream用来读取配置文件的 IO 流。
  • SqlSession:相当于 Hibernate 的 Session,作用为执行 CRUD 操作。
  • Executor:执行器,SqlSession 通过调用它来完成具体的 CRUD,它是一个接口,提供了两种实现,即缓存的实现、数据库的实现。
  • Mapped Statement:在映射文件里面配置,包含3部分内容:具体的 SQL,SQL执行所需的参数类型,SQL 执行结果的封装类型,参数类型和结果集封装类型包括3种,即 HashMap,基本数据类型,POJO。

四、总结

就目前来看,很多的公司依然使用SSH的框架来做一些项目,业务逻辑复杂但他们不在乎执行的效率。但我觉得SSM是优于SSH的,SSM和SSH框架的区别就在于SpringMVC和Struts2、MyBatis与Hibernate的比较。

1、SpringMVC 和 Struts2 比较

  • 机制:SpringMVC 的入口是 Servlet,Struts2 的入口是 Filter, 两者的实现机制不同;
  • 性能:SpringMVC 稍微比 Struts 快些。SpringMVC 是基于方法的设计,而 Struts2 是基于类,每发一次请求都会实例化一个 action,每个 action 都会被注入属性,而 SpringMVC 基于方法,粒度更细。
  • 参数传递:Struts2 在接受参数时,可以用属性来接受参数,这就说明参数可被多个方法共享。SpringMVC 是基于方法的设计,传递参数是通过方法形参。多个方法间不能共享。
  • 设计思想上:Struts2 更加符合 OOP 的编程思想,SpringMVC 就比较谨慎,在 Servlet 上扩展

2、Mybatis 和 Hibernate 比较

  • 难易程度:Hibernate 的真正掌握要比 Mybatis 难些。Mybatis 框架相对简单容易上手。
  • 对象管理:Hibernate 是完整的对象/关系映射解决方案,它提供了对象状态管理的功能,使开发者不需要关心底层数据库系统的细节。而 Mybatis 在这一块没有文档说明,用户需要自己对对象进行详细的管理。
  • 优势对比:Mybatis 可以进行更为细致的 SQL 优化,可以减少查询字段。Hibernate 数据库移植性很好,Mybatis 的数据库移植性不好,不同的数据库需要些不同的 SQL。

 

 

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐