Java开发中常用的框架有哪些?

  “框架(Framework)\”一词最早出现在建筑领域,指的是在建造房屋前期构建的建筑骨架。在编程领域,框架就是应用程序的骨架,开发人员可以在这个骨架上加入自己的东西,搭建出符合自己需求的应用系统。

  软件框架是一种通用的、可复用的软件环境,它提供特定的功能,促进软件应用、产品和解决方案的开发工作。软件框架会包含支撑程序、编译器、代码、库、工具集以及API,它把所有这些部件汇集在一起,以支持项目或系统的开发。

  软件框架可以形象地比喻成我们在盖楼房时,用梁+柱子+承重墙搭建起来的钢筋混凝土结构的建筑框架,它是整个建筑的骨架。而实现的软件功能,也就像在这个建筑框架中所要实现的不同类型、功能的房子,比如健身房、商场、酒店、饭店等。

  在早期Java EE应用开发中,企业开发人员是利用JSP+Servlet技术进行软件应用和系统开发的,使用该技术会有以下两个弊端。

  (1)软件应用和系统可维护性差如果全部采用JSP+Servlet技术进行软件的开发,因为分层不够清晰,业务逻辑的实现无法单独分离出来,从而造成系统后期维护困难。

  (2)代码重用性低

  企业希望以最快的速度,开发出最稳定、最实用的软件。如果系统不使用框架,每次开发系统都需要重新开发,需要投入大量的人力物力,并且重新开发的代码可能具有更多的漏洞,这就增加了系统出错的风险。

  相比于使用JSP+Servlet技术进行软件开发,使用框架有以下优势。

  1.提高开发效率:如果采用成熟、稳健的框架,那么一些通用的基础工作,如事务处理、安全性、数据流控制等都可以交给框架处理,程序员只需要集中精力完成系统的业务逻辑设计,降低了开发难度。

  2.提高代码规范性和可维护性:当多人协同进行开发时,代码的规范性和可维护性就变得非常重要。成熟的框架都有严格的代码规范,能保证团队整体的开发风格统一。

  3.提高软件性能:使用框架进行软件开发,可以减少程序中的冗余代码。例如,使用Spring框架开发时,通过Spring的IOC特性,可以将对象之间的依赖关系交给Spring控制,方便解耦,简化开发;使用MyBatis框架开发时,MyBatis提供了XML标签,支持动态的SQL,开发人员无需在类中编写大量的SQL语句,只需要在配置文件中进行配置即可。

  Spring是一个开源框架,是为了解决企业应用程序开发复杂性而创建的,其主要优势之一就是分层架构。Spring提供了更完善的开发环境,可以为POJO(Plain Ordinary Java Object,普通Java对象)对象提供企业级的服务。

Spring MVC框架

  Spring MVC是一个Web开发框架,可以将它理解为Servlet。在MVC模式中,Spring MVC作为控制器(Controller)用于实现模型与视图的数据交互,是结构最清晰的。

  Spring MVC框架采用松耦合、可插拔的组件结构,具有高度可配置性,与其他的MVC框架相比,具有更强的扩展性和灵活性。

  MyBatis是Apache的一个开源项目iBatis,2010年这个项目由Apache Software Foundation迁移到了Google Code,并且改名为MyBatis,2013年11月MyBatis又被迁移到Github。

  MyBatis是一个优秀的持久层框架,它可以在实体类和SQL语句之间建立映射关系,是一种半自动化的ORM(Object/Relation Mapping,即对象关系映射)实现。MyBatis封装性要低于Hibernate,但它性能优越、简单易学,在互联网应用的开发中被广泛使用。

  Spring Boot框架是Pivotal团队基于Spring开发的全新框架,其设计初衷是为了简化Spring的配置,使用户能够构建独立运行的程序,提高开发效率。

  Spring Boot框架本身并不提供Spring框架的核心特性及扩展功能,它只是用于快速、敏捷地开发新一代基于Spring框架的应用,同时它还集成了大量的第三方类库(如Jackson、JDBC、Redis等),使用户只需少量配置就能完成相应功能。

  Spring Cloud是一系列框架的有序集合,为开发人员构建微服务架构提供了完整的解决方案,它利用Spring Boot的开发便利性巧妙地简化了分布式系统的开发。例如,配置管理、服务发现、控制总线等操作,都可以使用Spring Boot做到一键启动和部署。可以说,Spring Cloud将Spring Boot框架进行了再封装,屏蔽掉了复杂的配置和实现原理,具有简单易懂、易部署和易维护等特点。

Java的三大主流框架,快来看看你常用的是哪一种?

众所周知,Strus、Hibernate、和spring是我们java开发中常用关键,这三个分别对应不同的应用场景给出相对应最合适的解决方案。今天就来扒一扒他们最初是怎样出现的?

首先知道,传统的Java Web应用程序是采用JSP+Servlet+javabean来实现的,这种模式实现了最基本的MVC分层,使程序结构分成了好几层。但是这种结构仍然有弊端存在,比如JSP页面中需要使用符号嵌入很多的java代码,这样页面的结构就会非常的乱等等。

首先介绍struts

为了解决这些传统的问题,struts应运而生,在MVC方面,它几乎是一个完美的框架。它拥有一个中央控制类,针对不同的业务,我们需要一个Action类型的东西负责页面跳转和后台逻辑的运算,一个或者几个JSP页面负责数据的输入和输出显示,还有一个Form类负责传递Action和JSP中间的数据。JSP中可以用Struts提供出一组标签,这个就和HTML标签一样简单,但是对于复杂逻辑的完成却非常的好。至此JSP页面包围一行代码的日子一去不复返。

但是所有的运算逻辑都放在了Struts的Action里面就会造成复用度低而且逻辑混乱的问题。所以通常情况下,把Web应用程序分为三层,Struts负责显示层,负责调度业务层完成运算逻辑,再用业务层调用持久层完成数据库的读写。

最后用JDBC连接来读写数据库,我们最常见的基本就是打开数据库链接、用复杂的SQL语言进行读写,关闭链接,获得的数据又需要转换或封装后往外传,这个过程相当的繁琐。

再者是Hibernate

这时Hibernate就应运而生了,这需要你创建一系列的持久化类,每个类的属性都可以简单的看做和一张数据库表的属性一一对应,当然也可以实现关系数据库的各种表件的关联的对应。当我们需要的相关操作是,不用再关注数据库表。我们不用再去一行行的查询数据库,只需要持久化类就可以完成增删改查的工作。使我们的软件开发真正的面对对象而不是面向非常混乱的代码。基本在我使用这么久之后,Hibernate比JDBC方式减少了至少80%的编程量。

现在有三个层了,可是每层之间的调用到底是怎么样的?比如显示层的Struts需要调用一个业务类,就需要new一个业务类出来,然后再用。业务层需要调用持久层的类,也需要一个持久层。通过这种方式互相调用就是软件开发中最糟糕的设计设计。说通俗一点,就是调用者对被调用者的依赖性非常高,如果我想在其他地方复用某个类,则这个类依赖的其他类都会收到牵连。然后spring框架出现。

最后Spring

Spring的作用就是完全解耦类之间的依赖关系,一个类如果要依靠什么,那就是一个接口。至于之后如何实现这个接口,并不是特别重要。只要拿到一个实现了这个接口的类,就可以通过xml配置文件把实现类注射到调用接口的那个类里。所有类之间的这种依赖关系就完全通过配置文件的方式替代了。所以Spring框架最核心的就是所谓的依赖注射和控制反转。

现在的结构基本是Struts负责显示层,Hibernate负责持久层,Spring负责中间的业务层,这个结构是目前国内最流行的Java Web应用程序构架了。另外,由于Spring使用的依赖注射以及AOP,所以它的这种内部模式非常的优秀,以至于Spring自己也实现了一个使用依赖注射的MVC框架,叫做SpringMVC,同时为了很好的处理事物,Spring集成了Hibernate,使事物管理从Hibernate的持久层提升到了业务层,使用更加方便和强大。

写在最后

Java这个名词似乎注定和开源紧密联系在一块了,在Java界,基本每天都有新的大量的开源技术出现,由于是开放源代码的,技术中存在的问题和不足很快就会被人发现,开源软件提供者会很快的修改或者修正拓展这些技术,因此版本更新换代非常的快,几个星期甚至几天就有了新的版本。所以这是一个年轻化的职业,注定了要不断学习,不断关注最新的技术,然后学习和使用。

核心知识内容来源:php中文网

Java集合框架最全详解(看这篇就够了)

Java集合非常的重要,而且还是大厂面试的重灾区,本篇会全面介绍Java集合@mikechen

Java集合类主要由两个根接口Collection和Map派生出来的。

Collection派生出了三个子接口:

1)List

List代表了有序可重复集合,可直接根据元素的索引来访问

2)Set

Set代表无序不可重复集合,只能根据元素本身来访问

3)Queue

Queue是队列集合

Map接口派生:

Map代表的是存储key-value对的集合,可根据元素的key来访问value。

因此Java集合大致也可分成List、Set、Queue、Map四种接口体系

List代表了有序可重复集合,可直接根据元素的索引来访问。

List接口常用的实现类有:ArrayList、LinkedList、Vector。

  • 集合中的元素允许重复
  • 集合中的元素是有顺序的,各元素插入的顺序就是各元素的顺序
  • 集合中的元素可以通过索引来访问或者设置

ArrayList是一个动态数组,也是我们最常用的集合,是List类的典型实现。

它允许任何符合规则的元素插入甚至包括null,每一个ArrayList都有一个初始容量(10),该容量代表了数组的大小。

随着容器中的元素不断增加,容器的大小也会随着增加,在每次向容器中增加元素的同时都会进行容量检查,当快溢出时,就会进行扩容操作。

所以如果我们明确所插入元素的多少,最好指定一个初始容量值,避免过多的进行扩容操作而浪费时间、效率。

ArrayList擅长于随机访问,同时ArrayList是非同步的。

与ArrayList相似,但是Vector是同步的,它的操作与ArrayList几乎一样。

LinkedList是采用双向循环链表实现,LinkedList是List接口的另一个实现,除了可以根据索引访问集合元素外,LinkedList还实现了Deque接口,可以当作双端队列来使用,也就是说,既可以当作“栈”使用,又可以当作队列使用。

1)ArrayList优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程不安全,效率高

2)Vector优点: 底层数据结构是数组,查询快,增删慢。缺点: 线程安全,效率低

3)LinkedList优点: 底层数据结构是链表,查询慢,增删快。缺点: 线程不安全,效率高

Set扩展Collection接口,无序集合,不允许存放重复的元素。

Set接口常用的实现类有:HashSet、LinkedHashSet、TreeSet

HashSet是Set集合最常用实现类,是其经典实现。

HashSet底层数据结构采用哈希表实现,元素无序且唯一,线程不安全,效率高,可以存储null元素,元素的唯一性是靠所存储元素类型是否重写hashCode()和equals()方法来保证的,如果没有重写这两个方法,则无法保证元素的唯一性。

底层数据结构采用链表和哈希表共同实现,链表保证了元素的顺序与存储顺序一致,哈希表保证了元素的唯一性。

底层数据结构采用二叉树来实现,元素唯一且已经排好序,唯一性同样需要重写hashCode和equals()方法,二叉树结构保证了元素的有序性。

1)HashSet

  • 底层其实是包装了一个HashMap实现的
  • 底层数据结构是数组+链表 + 红黑树
  • 具有比较好的读取和查找性能, 可以有null 值
  • 通过equals和HashCode来判断两个元素是否相等
  • 非线程安全

2)LinkedHashSet

  • 继承HashSet,本质是LinkedHashMap实现
  • 底层数据结构由哈希表(是一个元素为链表的数组)和双向链表组成。
  • 有序的,根据HashCode的值来决定元素的存储位置,同时使用一个链表来维护元素的插入顺序
  • 非线程安全,可以有null 值

3)TreeSet

  • 是一种排序的Set集合,实现了SortedSet接口,底层是用TreeMap实现的,本质上是一个红黑树原理
  • 排序分两种:自然排序(存储元素实现Comparable接口)和定制排序(创建TreeSet时,传递一个自己实现的Comparator对象)
  • 正常情况下不能有null值,可以重写Comparable接口 局可以有null值了。

队列是数据结构中比较重要的一种类型,它支持 FIFO,尾部添加、头部删除(先进队列的元素先出队列),跟我们生活中的排队类似。

PriorityQueue保存队列元素的顺序并不是按照加入的顺序,而是按照队列元素的大小进行排序的。PriorityQueue不允许插入null元素。

Deque接口是Queue接口的子接口,它代表一个双端队列,当程序中需要使用“栈”这种数据结构时,推荐使用ArrayDeque。

Map用于保存具有映射关系的数据,Map里保存着两组数据:key和value,它们都可以使任何引用类型的数据,但key不能重复。

Map接口基于哈希表的实现,是使用频率最高的用于键值对处理的数据类型。

它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,特点是访问速度快,遍历顺序不确定,线程不安全,最多允许一个key为null,允许多个value为null。

可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap类。

Hashtable和HashMap从存储结构和实现来讲有很多相似之处,不同的是它承自Dictionary类,而且是线程安全的,另外Hashtable不允许key和value为null,并发性不如ConcurrentHashMap。

Hashtable不建议在新代码中使用,不需要线程安全的场合可以用HashMap替换,需要线程安全的场合可以用ConcurrentHashMap替换。

LinkedHashMap继承了HashMap,是Map接口的哈希表和链接列表实现,它维护着一个双重链接列表,此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。

TreeMap实现SortMap接口,能够把它保存的记录根据键排序,默认是按键值的升序排序(自然顺序),也可以指定排序的比较器,当用Iterator遍历TreeMap时,得到的记录是排过序的。

更多架构技术干货,私信【架构】即可查看我原创的300期+BAT架构技术系列文章与1000+大厂面试题答案合集。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。