1、什么是框架?
框架( Framwork )是构成一类特定软件可复用设计的一组相互协作的类。框架规定了你的应用的体系结构。它定义了整体结构,类和对象的分割,各部分的主要责任,类和对象怎么协作,以及控制流程。框架预定义了这些设计参数,以便于应用设计者或实现者能集中精力于应用本身的特定细节 因为软件系统发展到今天已经很复杂了,特别是服务器端软件,涉及到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,他可以处理系统很多细节问题,比如,事务处理,安全性,数据流控制等问题。还有框架一般都经过很多人使用,所以结构很好,所以扩展性也很好,而且它是不断升级的,你可以直接享受别人升级代码带来的好处。 框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。 软件为什么要分层? 为了实现“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源…总之好处很多啦。
简而言之:框架就是一个应用程序的体系结构。结构已经确定,我们只需要完成业务逻辑即可。
2、什么是SSM框架。
SSM是Spring、SpringMVC、Mybatis的简称,用作Web项目。
在没有Spring的情况下,Web项目开发有什么问题呢?
当时的Java开发大量使用try...catch...finally...,因为Web开发需要频繁操作数据库,需要使用异常捕捉来控制业务逻辑,导致代码复杂。 很多时候一个对象非常复杂,这个对象需要大量其他对象最为自己的属性,比如吃饭,需要筷子、碗、桌子、米饭........因此软件测试要先创建筷子、碗、桌子、米饭,才能创建吃饭这个对象来测试。但是这些都不是测试人员所熟悉的,而是开发人员熟悉的,这大大提高了测试人员的工作量。 在过去的Java技术中,很多框架都具有侵入性,也就是必须使用当前框架所提供的类库才能实现一定的功能,这样就造成了软件对框架的依赖。 基于接口的编程时一种理念,强调OOD的设计理念,比技术实现更重要,因为实现是可以多样化的,但是如果没有一个好的设计理念,那么代码的可读性就会变得很差,从而导致大型项目开发难度高,后期难以开发、维护、和扩展。
- Spring
Spring是Java世界中最成功的框架,它的成功源自于理念,而不是技术。
在Spring中,一切Java类都是资源,而资源都是Bean,容纳这些Bean的是Spring提供的IoC容器。Spring是基于Bean的编程。
并且,Spring技术并不是为了代替任何技术,而是将所有的技术整合起来。
Spring核心IoC控制反转。
“我”,充当主动角色,我喝水的时候,需要杯子,于是我new一个杯子来用。至始至终都是以“我”为中心。这就是控制“正”转。 控制反转,就是把杯子交给容器来管理,当“我”需要杯子的时候,去请求Spring给“我”一个杯子,“我”不再是控制方,而是请求者。控制权在容器手里,“我”依赖容器的资源。 资源交给“我”的过程,就是依赖注入。
假如入口类“我”是一家公司,“我”去找员工&员工提交简历给我,哪个对我有利?不要我去new,而是对象向IOC容器递交简历,我需要什么资源,IOC再交给我。
有没有一丝第三方劳务派遣的味道?主要是为了降低“我”的开销。
直观来说,我们不需要频繁地new对象了,Spring会读取配置文件把所有的类都放在容器中,需要的时候直接送上。
控制反转是一种通过描述(xml配置或者注解),再通过第三方去产生或者获取对象的方式。而对象内部依赖的复杂性也无需我们去考虑,容器给你提供的对象,必然是可用的。
- SpringMVC
在早期的JavaWeb开发中,主要是JSP+JavaBean的模式,我们称之为Model1。
但是,JSP和Java之间出现了严重的耦合,Java和HTML也耦合在一起,开发者不仅仅要掌握Java,还要掌握高超的前端技术。
更可怕的是,页面前端和后端相互依赖,前端需要等待后端就绪,后端也依赖于前端完成,这样才能进行有效的测试。
并且,由于高度耦合,功能模块难以复用。
所以早期的MVC模型诞生了,Servlet+JSP+JavaBean流行起来。
用户的请求到达Servlet,Servlet作为控制器接受这个请求,再调度JavaBean,来对数据库进行持久化操作,然后把结果返回给JSP,这样的模式成为MVC模式。JavaBean是Model,Servlet是Controller,JSP是View。
这样的好处是,Controller和Model得到很好的分离,大量的Java代码得到复用。但是Controller和View还存在一定程度的耦合。而这个时候作为MVC经典框架Struts1和Struts2以及模型层Hibernate崛起了。
但是Struts是依赖于页面编程的 ,随着移动互联网的兴起,Web页面大部分采用Ajax请求,数据格式为JSON。这样对于JSP的耦合度大大降低,Struts已经不适合时代发展了。
而互联网时代性能是最重要的,不可优化SQL亦不灵活成为了Hibernate的不治之症。
而一直没有处理好的数据库事物编程,NoSql的强势崛起,当时的持久层框架都不能处理。
SpringMVC时代来临。
SpringMVC是一种基于Servlet的技术,其核心控制器为DispatcherServlet及相关组件,从名字上来看,它就是一个Servlet。
根据我们对Servlet的了解,DispatcherServelt会拦截HTTP发过来的请求,在init阶段获取配置信息,得到统一的资源标识符(URL)和处理器(Handler)之间的映射关系。
为了灵活和功能增强,SpringMVC还增加了拦截器,可以在处理器执行前后加入自己的代码,这样就构成了处理器执行链条。
处理完毕后,根据上下文视图解析器定位视图,将数据模型渲染到视图中,最终完成对用户请求的响应。
SpringMVC的优势在于:
模型层被拆分为业务层(Service)和数据访问层(Dao),在Service下我们可以通过Spring的声明事物操作数据库访问层,在Service中还允许我们访问NoSql。 SpringMVC结构松散,在SpringMVC中可以使用JSON、JSP、XML、PDF等等就,满足平板、手机,页面的各类请求。
- MyBatis
持久层是将业务数据存储到磁盘(持久存储)的一个层面,Mybatis就是一个持久层框架。
Mybatis的优点显而易见:
不屏蔽SQL,可以精确地定位SQL语句,也可以对Sql进行优化和改造,有利于互联网开发对性能的要求。
强大灵活的映射机制,提供动态SQL的功能,允许SQL组装,可读性可维护性好。
提供Mapper接口编程,只要一个接口和XML就能创建映射器,几乎省略了所有的JDBC代码,诸多框架API在Mybatis中消失,开发者集中精力在业务逻辑上。
通过SqlSessionFactoryBuild从xml配置文件中构建出SqlSessionFactory。 SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行其映射的Sql语句,完成对数据库的crud和事物提交,之后关闭SqlSession。 SqlSession是单线程对象,非线程安全,是持久化的独享操作,底层封装了JDBC连接。