什么是框架
通俗的理解,框架是我们软件开发中的一套解决方案,不同的框架解决的问题是不同的,比如MyBatis框架解决的是持久层的问题,springMVC框架解决的是表现层的问题。
需要注意的是,框架它本身自己是不能实现业务上的功能,它只能对,比如说持久层、表现层、结构合理性等等,提供一些解决方案,而真正的业务层部分,还需要程序员自己来提供。所以说,框架可以理解为一个半成品,我们选用这个半成品,然后加上业务需求(即项目中的需求)来最终实现整个的功能。
而我们使用框架的目的其实也很简单,就是为了提高开发的效率,而不用关心一些繁琐的、复杂的底层代码实现,从而把更多的精力用在需求的实现上。
框架能帮我们解决哪些问题
要明白框架能解决哪些问题,首先要知道三层架构。
三层架构分为三层:
表现层:是用于展示数据的;
业务层:是处理业务需求的;
持久层:是和数据库交互的。
从这张图可看出上面列出的三个框架和三层架构所处的位置。可以看出MyBatis框架是一个持久层框架,它是和数据库交互的;而下面的Spring框架有点特殊,它不属于任何一层;SpringMVC框架是处于表现层的,它是一个表现层框架。
从这张图可大致得出,不同的框架是各司其职的,它们解决某一层或者某一类的事情。
对一些主流框架的认识
由于以下具体的框架都没有学过,所以只能说一说,我对这些框架的大体认识,可能对于某些框架没用使用过和对比过很难对它的优势有深刻的认识,只能在后续的学习中,深入理解。
1、Struts2框架
Struts2框架处于三层架构的表现层,可以用来替代掉Servlet技术,来处理前端访问服务器的请求(如表单、页面提交过来的请求),所以Struts2是属于一个前端处理的框架。
下图显示了Struts2框架在三层架构中的位置:
对于web日常的工作,比如获取请求参数、转发、重定向、校验参数等等,使用Servlet技术基本都可以完成。既然使用Servlet技术基本都可以完成我们的需求,为什么还要使用Struts2这个框架呢?原因在于Struts2有其自身的优势,相比使用Servlet,Struts2用起来更加方便,很多事情它自动就帮我们做了,而且Struts2还具有更加先进的架构和思想。
对于Struts2框架的历史也非常有意思,大部分框架不同版本之间性质上不会有什么改变,基本是不断修改bug和完善功能,而Struts2和它之前的版本Struts1之间的最大区别就是技术上没什么关系,这就要从Struts的历史说起。
在早年Struts2还没出来的时候,Struts1特别火,用得很广,但这时候Struts1的作者非常苦恼,因为Struts1当时虽然很好用,但是它基于的架构和所有的功能构建都是在Servlet之上(这里指的不是Servlet技术,而是具体的Servlet类),而Servlet是线程不安全的,所以导致整个Struts1框架也是处于一种线程不安全状态,使得很多的功能无法落实,所以Struts1的作者就很苦恼这个问题,他一直在研发新的架构。与此同时,另外有一个团队也非常苦恼,这个团队(也就是WebWork团队)也开发了一款前端处理框架,但是他们是后来人,他们看到了Struts的缺陷,于是他们开发出来的框架同样也是基于Servlet技术,但它们基于的是Filter(过滤器),这样设计出来的框架会灵活很多,而且从架构上来说彻底摆脱了线程安全问题。可是当时满大街用的都是Struts1框架,WebWork团队辛辛苦苦开发出的框架根本没人用,推广不出去。于是,WebWork就想了一个办法,找到了Struts1的作者想要一起合作,Struts的作者看到这个新的框架后,两者一拍即合,于是有了Struts2框架。所以Struts2的前身就是WebWork,而Struts1和Struts2两者基本是两个不同的框架,当然后来Struts1的作者也把自己之前想要在Struts1中实现的想法带入到了Struts2中来,所以现在的Struts2框架是一个强强联手的框架,整合了Struts1和WebWork的优点。
2、SpringMVC
要了解SpringMVC,首先来看看MVC模型,对于表现层的框架一般都会采用MVC这种设计模型去做架构,MVC即:
M model 模型:实际上就是java中JavaBean的一个对象,用来封装数据;
V View 视图:其中指的是jsp技术或者HTML这种技术,用来显示;
C Controller 控制器:指的是像Servlet这种技术,能用来接收请求。
MVC这种设计模型的意思就是,发请求,请求先到达控制器(Controller),控制器接收请求,请求接收到之后,再用一个JavaBean(model)把拿到的数据封装起来,根据这个JavaBean中封装的数据就可以调用业务层进行业务处理,业务层如果再访问持久层的数据,也可以再把数据封装到JavaBean当中,最终可以把程序转发到jsp(view),jsp显示结果生成HTML响应给用户,这就是整个一个MVC模型,分工非常明确。在此我向大家推荐一个架构学习交流圈。交流学习指导伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多
SpringMVC框架也是一个处于表现层的框架,是采用MVC模型来设计的,所以它能够接受请求,拿到请求参数,并进行数据的封装,还可以转发到jsp显示对应的数据。同时,它也是一个轻量级的web框架,它属于Spring FrameWork的一个后续产品,已经融合在Spring Web Flow中。做web开发可以选择SpringMVC这个框架,也可以选择别的框架(比如Struts2),因为最终Spring都可以帮你集成。但使用SpringMVC更有好处,因为SpringMVC属于Spring的一部分,SpringMVC和Spring的整合相比别的框架更加容易。
SpringMVC目前已经成为最主流的框架之一,并且随着Spring3.0的发布,已经全面超越Struts2,成为最优秀的MVC框架。
它通过一套注解,让一个简单的Java类成为处理请求的控制器,而无须实现任何接口,而如果我们使用Servlet,必须继承HttpServlet或者实现Servlet接口。同时它还支持RESTful编程风格的请求。
3、Hibernate框架和Mybatis
Hibernate框架是一个全自动的、完全面向对象的持久层框架,代替了以往的DButils帮助我们完成数据库操作。
下图显示了Struts2框架在三层架构中的位置:
使用Hibernate框架的好处:能够使我们操作数据库时,可以用面向对象的方式来完成,而不需要写SQL语句。
Hibernate是一款orm框架,orm(Object Relational Mapping,)即对象关系映射,在hibernate中体现为使用一个配置文件来配置表,即对象与数据中表之间的映射关系,其中对象名对应一个表名,对象属性对应表中的某一列。
相对于Hibernate,Mybatis框架是一个半自动化的持久层框架,同样也是用于完成数据库操作。相比hibernate框架,两者有相同点也有不同点,hibernate框架sql语句已经被封装,直接可以使用,而mybatis 属于半自动化,sql需要手工完成,稍微繁琐,但可以避免不需要的查询,提高系统性能。同时Mybatis通过手动写SQL语句,也更容易维护。
在开发工程中,Hibernate框架无需过多关注底层实现,只要去管理对象即可,而Mybatis需要自行管理映射关系。
总结起来,Mybatis相比于Hibernate,更加的小巧、简单,某些操作需要我们自己完成。
4、Spring框架
Spring是分层的Java SE/EE应用full-stack(全栈式)轻量级开源框架,以IOC(Inverse Of Control 反转控制)和AOP(Aspect Oriented Programming 面向切面编程)为内核,提供了表现层MVC和持久层Spring JDBC以及业务层事务管理等众多的企业级应用技术,还能整合众多著名的开源第三方框架和类库,逐渐成为使用最多的JavaEE企业应用开源框架。
从这张图可看出,Spring不属于任何一层,它横跨了三层架构,它是一个以IOC和AOP为核心的容器框架,能管理应用对象的生命周期。我们之前创建对象一般都要通过new + 构造方法,而且每new一次就要开辟一块内存空间,这样如果项目中使用了1000个对象,就需要开辟1000块内存空间,而在某段时间中我们可能并不同时需要这1000个对象,这样就造成了资源的浪费,如果使用Spring这个容器,它就会自动帮我们管理这些对象的生命周期,就像tomacat容器帮我们管理Servlet的生命周期一样。
对AOP的简单理解:之前我们一直学的是OOP(面向对象编程),因为OOP存在某些缺陷,所以有了AOP(面向切面编程)去对OOP进行补充,所以AOP和OOP之间的关系不是包含关系,而是AOP是对OOP的补充。
Spring优点还在于组件化,Spring中的组件指的就是Spring所管理的对象。一个项目对我们来说,可以理解为由各个类产生对象,由对象调用方法,最终实现功能。而Spring可以把项目中用到的类进行管理,把这些对象称为组件,项目的实现由各个对象相互调用方法就可以变成组件之间的相互调用,这样项目就被组件化了。组件化的好处在于,组件与组件之间是没有关系的,这样就降低了程序之间的耦合。
Spring各个模块结构:
5、SpringBoot框架
SpringBoot框架是基于Spring框架的,所以SpringBoot本质还是Spring框架,它的出现是替代Spring中的缺点的,SpringBoot是对Spring的进一步封装,所以Spring能做的SpringBoot都能做,而且SpringBoot更加好用。
对Spring存在的缺点的简单理解:首先使用Spring框架,需要进行的配置是十分繁琐的,而且有些配置不论谁使用都是一样的,所以没有必要每次都配置;其次,项目的依赖管理也是一件耗时耗力的事情,在环境搭建时,需要分析导入库以及相关联库的坐标,一旦选错了依赖的版本,可能就会带来不兼容的问题。
而SpringBoot对上述的Spring存在的问题都提出了解决方案。它基于约定优于配置的思想,对于某些固定的配置自动就帮你配好了,让开发人员把更多的精力放在业务逻辑的处理上;而SpringBoot用起步依赖的方式,把具备某些功能的坐标打包到一起,方便导入,并提供了一些默认的功能。
综上,SpringBoot框架可以理解为对Spring的一种完善,它不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式。
总结
对于java web开发框架,开始是SSH(Struts、Spring、Hibernate)较为流行,后来升级为Struts2,到后来Struts2渐渐被SpringMVC替换掉,变成了Spring + SpringMVC + Hibernate/ibatis架构。
之后Hibernate配置维护需要的人力成本大而慢慢被ibatis代替,后来MyBatis出现了,从iBatis到MyBatis,MyBatis提供了更为强大的功能,同时并没有损失其易用性,就变成为了Spring+SpringMVC+Mybatis,这是很多公司比较流行的框架。
目前,随着SpringBoot的流行,开始向SpringBoot+Mybatis架构转变,同时基于SpringBoot的SpringCloud微服务框架开始成为前沿框架。