SSM框架学习:初探
原文链接 https://demon7452.github.io/2016/03/03/SSM%E6%A1%86%E6%9E%B6%E5%AD%A6%E4%B9%A0-%E5%88%9D%E6%8E%A2.html
注:以下为加速网络访问所做的原文缓存,经过重新格式化,可能存在格式方面的问题,或偶有遗漏信息,请以原文为准。
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相同,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。
- 从注入方法上看,主要可以划分为三种类型:构造函数注入、属性注入和接口注入。
- IoC: 控制反转(Inverse of Control)是Spring容器的内核,其作用是将某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定。
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稍长一些,不过稍后的调用则没有“第一次惩罚”的问题。
- BeanFactory:Bean工厂是Spring框架最核心的接口,它提供了高级Ioc的配置机制,使管理不同类型的Java对象成为可能。我们一般称BeanFactory为IoC容器。
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 处理请求的整体流程
- 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的详细对比