SSM框架学习:初探

2016年03月03日

SSM框架学习:初探

Note:参阅书籍《Spring 3.x企业应用开发实战》

一、Spring

定义

Spring 是分层的 Java SE/EE 应用一站式的轻量级开源框架,以 IoC(Inverse of Control 反转控制)AOP(Aspect Oriented Programming 面向切面编程)为内核,提供了 展现层:Spring MVC持久层:Spring JDBC 以及 业务层:事务管理 等众多的企业级应用技术。

  • Spring 容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入的工作。
  • Java 反射技术是 Spring 实现依赖注入的Java底层技术。
  • Spring 通过一个配置文件描述Bean及Bean之间的依赖关系,利用Java语言的反射功能实例化Bean并建立Bean之间的依赖关系。

相关概念

  • IoC/DI
    • IoC: 控制反转(Inverse of Control)是Spring容器的内核,其作用是将某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定。
      • “控制”:是接口实现类的选择控制权;
      • “反转”:是指选择控制权从调用类转移到外部第三方类或容器的手中。
    • DI: 依赖注入(Dependency Injection)的概念与IoC相同,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。
    • 从注入方法上看,主要可以划分为三种类型:构造函数注入属性注入接口注入
  • BeanFactory & ApplicationContext
    • BeanFactory:Bean工厂是Spring框架最核心的接口,它提供了高级Ioc的配置机制,使管理不同类型的Java对象成为可能。我们一般称BeanFactory为IoC容器。
      • BeanFactory是Spring框架的基础设施,面向Spring本身;
      • BeanFactory是类的通用工厂,它可以创建并管理各种类的对象;
      • 它最主要的方法是getBean(String beanName),该方法从容器中返回特定名称的Bean;
    • ApplicationContext:应用上下文建立在BeanFactory基础之上,提供了更多面向应用的功能,它提供了国际化支持和框架事件体系,更易于创建实际应用。
      • ApplicationContext 面向使用Spring框架开发者,几乎所有的应用场景我们都直接使用ApplicationContext而非底层的BeanFactory。
      • ApplicationContext由BeanFactory派生而来;
      • ApplicationContext的主要实现类是 ClassPathXmlApplicationContext 和 FileSystemXmlApplicationContext,前者默认从类(classpath)路径加载配置文件,后者默认从文件(file)系统中装载配置文件。
    • 初始化时的区别:
      • BeanFactory 在初始化容器时,并未实例化Bean,直到第一次访问某个Bean时才实例目标Bean;
      • ApplicationContext 在初始化应用上下文时就实例化所有单实例的Bean。
      • 因此ApplicationContext的初始化时间会比BeanFactory稍长一些,不过稍后的调用则没有“第一次惩罚”的问题。
  • AOP相关

    • 定义:AOP 是 Aspect Oriented Programming 的简称,即“面向切面编程”。它一般只适合于具有横切逻辑的应用场合:如性能监测访问控制事务管理以及日志记录
    • AOP术语:
      • 连接点(Joinpoint):程序执行的某个特定位置。
      • 一个类或一段程序代码拥有一些具有边界性质的特定点,这些代码中的特定点就称为“连接点”。如:方法调用前、调用后、方法抛出异常时等。
      • 连接点由两个信息确定:第一是用方法表示的程序执行点;第二是用相对点表示的方位
      • 切点(Pointcut):AOP通过“切点”定位特定连接点。
        • 切点和连接点不是一对一的关系,一个切点可以匹配多个连接点。
        • 切点通过org.springframework.aop.Pointcut接口进行描述,它使用类和方法作为连接点的查询条件。
        • 切点只定位到某个方法上,如果希望定位到具体的连接点上,还需要提供方位信息,如:方法前、方法后、方法抛出异常时。
      • 增强(Advice):增强是织入到目标类连接点上的一段程序代码。
        • 增强包含了用于添加到目标连接点上的一段执行逻辑,也包含了用于定位连接点的方位信息。所以增强接口都是带有方位名:BeforeAdvice、AfterReturningAdvice、ThrowsAdvice等。
        • 只有结合增强切点才能确定特定的连接点并实施增强逻辑。由切点找到连接点相关的类或方法,再加上增强包含的方位信息确定特定的连接点,然后执行相应的增强逻辑。
      • 目标对象(Target):增强逻辑的织入目标类。
      • 引介(Introduction):引介是一种特殊的增强,它为类添加一些属性和方法。
      • 织入(Weaving):织入是将增强添加到目标类具体连接点上的过程。
        • 根据不同的实现技术,AOP有三种织入的方式:
          • 编译期织入,这要求使用特殊的Java编译器;
          • 类装载期织入,这要求使用特殊的类装载器;
          • 动态代理织入,在运行期为目标类添加增强生成子类的方式。
        • Spring 采用动态代理织入;AspectJ采用编译期织入和类加载期织入。
    • 代理(Proxy):一个类被AOP织入增强后,就产生了一个结果类,它是融合了原类和增强逻辑的代理类。根据不同的代理方式,代理类既可能是和原类具有相同接口的类,也可能就是原类的子类。
    • 切面(Aspect):切面由切点和增强(引介)组成,它既包括了横切逻辑(Advice)的定义,也包括了连接点(Joinpoint)定义。
    • AOP总结:
      • Spirng AOP是负责实施切面的框架,它将切面所定义的横切逻辑织入到切面所指定的连接中。
      • AOP的工作重心在于如何将增强应用于目标对象的连接点上,这主要包括两个工作:第一,如何通过切点和增强定位到连接点上;第二,如何在增强中编写切面的代码。

二、Spring MVC

定义

  • Spring MVC 是展现层的一种Web框架,它与 Struts、WebWork等MVC框架类似。
  • Spring MVC 框架围绕DispatcherServlet这个核心展开,它负责截获请求并将其分派给相应的处理器处理;负责协调和组织不同组件以完成请求处理并返回响应的工作。
  • Spring MVC 是基于Model 2实现的技术框架,Model 2 基于经典的MVC(Model,View,Control)模型,其利用处理器分离模型、视图和控制,达到不同技术层级松散耦合的效果,提高系统灵活性、复用性和可维护性

Spring MVC 框架模型

Spring MVC 框架模型

  • Spring MVC 处理请求的整体流程
    • 1、暂略。

三、MyBatis

定义

  • MyBatis 是一个可以自定义SQL、存储过程和高级映射的持久层框架。类似于Hibernate.
  • MyBatis摒除了大部分的JDBC代码、手工设置参数和结果集重获。
  • MyBatis只使用简单的XML和注解来配置和映射基本数据类型、Map接口和POJO到数据库记录。
  • 每一个MyBatis 应该都是以一个SqlSessionFactory实例为中心。一个 SqlSessionFactory实例可以使用SqlSessionFactoryBuilder来创造。 从配置类中创造的定制SqlSessionFactoryBuilder实例, 可以使用XML配置文件来生成一个SqlSessionFactory实例.

    MyBatis与Hibernate对比

  • 两者的相同点:
    • Hibernate与MyBatis都可以是通过SessionFactoryBuider由XML配置文件生成SessionFactory,然后由SessionFactory 生成Session,最后由Session来开启执行事务和SQL语句。其中SessionFactoryBuider,SessionFactory,Session的生命周期都是差不多的。
    • Hibernate和MyBatis都支持JDBC和JTA事务处理。
  • Mybatis优缺点:
    • MyBatis可以进行更为细致的SQL优化,可以减少查询字段。
    • MyBatis容易掌握,而Hibernate门槛较高。
    • iBATIS入门简单,即学即用,提供了数据库查询的自动对象绑定功能,而且延续了很好的SQL使用经验,对于没有那么高的对象模型要求的项目来说,相当完美。
    • iBATIS的缺点就是框架还是比较简陋,功能尚有缺失,虽然简化了数据绑定代码,但是整个底层数据库查询实际还是要自己写的,工作量也比较大,而且不太容易适应快速数据库修改。
  • Hibernate优缺点:
    • Hibernate的DAO层开发比MyBatis简单,Mybatis需要维护SQL和结果映射。
    • Hibernate对对象的维护和缓存要比MyBatis好,对增删改查的对象的维护要方便。
    • Hibernate数据库移植性很好,MyBatis的数据库移植性不好,不同的数据库需要写不同SQL。
    • Hibernate有更好的二级缓存机制,可以使用第三方缓存。MyBatis本身提供的缓存机制不佳。
    • Hibernate功能强大,数据库无关性好,O/R映射能力强,如果你对Hibernate相当精通,而且对Hibernate进行了适当的封装,那么你的项目整个持久层代码会相当简单,需要写的代码很少,开发速度很快,非常爽。
    • Hibernate的缺点就是学习门槛不低,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡取得平衡,以及怎样用好Hibernate方面需要你的经验和能力都很强才行。

参考文档

1、 From Hibernate To Mybatis (一)
2、 mybatis(上篇)
3、Hibernate与 MyBatis的比较
4、【持久化框架】Mybatis与Hibernate的详细对比