• 框架面试题(maven、ZooKeeper、Dubbo、Nginx、Redis、Lucene、Solr、ActiveMQ、JMS


    1. 什么是 Maven?
      Maven 使用项目对象模型(POM)的概念,可以通过一小段描述信息来管理项目的构建,
      报告和文档的软件项目管理工具。
      Maven 除了以程序构建能力为特色之外,还提供高级项目管理工具。由于 Maven 的
      缺省构建规则有较高的可重用性,所以常常用两三行 Maven 构建脚本就可以构建简单的项
      目。由于 Maven 的面向项目的方法,许多 Apache Jakarta 项目发布时使用 Maven,而
      且公司项目采用 Maven 的比例在持续增长。
      Maven 的出现,解决了开发过程中的 jar 包升级及依赖的难题。它可以对项目依赖的 jar
      包进行管理,可以让你的项目保持基本的依赖,排除冗余 jar 包,并且可以让你非常轻松的
      对依赖的 jar 包进行版本升级。而这些仅仅是 Maven 最基本的功能,它可以在这基础上对项
      目进行清理、编译、测试、打包、发布等等构建项目的工作。
      可以说,Maven 是现在 Java 社区中最强大的项目管理和项目构建工具,而更加值得庆幸的
      是,这样一个强大的工具,它的使用也是非常简单的。
      现在,JavaEE 项目使用的开源软件都可以通过 Maven 来获取,并且,越来越多的公司
      也开始使用 Maven 来管理构建项目了。
    2. Maven 和 ANT 的区别
      1.maven&ant 同属 apach 是流行的构建工具。
      都是为了简化软件开发而存在的。但是 maven 因为自身管理一个项目对象模型(project
      object model),这个模型其实就是抽象了一个项目的开发流程,它包含了一个项目的生命
      周期的各个阶段,并将这个周期固定下来,这也就是约定大于配置。约定大于配置的意思就
      是,我 maven 将项目开发的各个阶段固定起来了,每个文件的存放位置,每个阶段要生成
      什么文件、保存为什么格式并且要把它放在什么位置,我都固定好了。我知道一个软件是怎
      么开发出来,如果一个项目要使用 maven,可以,但你要遵循我的规则,文件目录不要乱建
      乱放,只有这样 maven 才会将源码用起来。这就是约定大于配置,因为 maven 已经将流程
      固定下来了,只要遵守约定,就不需要自己手动去配置了,这将大大地提高开发效率。
      就像是开车一样,只要知道点火、油门、方向、刹车,就可以将车子开东起来(当然出于安
      全和法律考虑,还是要考驾照的。),关于车子内部的传动原理,电气原理,工程原理,普通
      人并不需要了解多少,日常够用就好了。这也是约定大于配置的一个例子。配置就是自己造
      一辆车去开,有必要,有能力,有时间吗?
      2.maven 的中央仓库和 pom.xml 文件。中央仓库统一存放了开发用到的各种 jar 包,要用
      时只需要添加依赖到 pom 文件中,maven 就会自动下载,当然为了方便一般会在本地建一
      个仓库,减少下载时间。pom 文件是 maven 的配置文件,maven 就是通过管理 pom 文件
      和一些核心插件来管理项目。当然我前面将 maven 拟人化了,其实 maven 是没有智力的,
      一切都是封装好的流程,只是 maven 将很多操作隐藏起来了。
      3.ant 的 build.xml 文件。build 文件是 ant 的配置文件,ant 依靠它来执行操作,与 maven
      不同的是 ant 没有固定一条程序链。你想要执行什么操作以及操作之间的顺序和依赖关系,
      都需要手动添加到 build 文件中,一点一滴都要写清楚,否则 ant 就不会执行。
      4.maven 和 ant 区别
      Maven 拥有约定,只要遵守约定,它就知道你的源代码在哪里。Maven 是声明式的。你需
      要做的只是创建一个 pom.xml 文件然后将源代码放到默认的目录。Maven 会帮你处理其
      它的事情。Maven 有一个生命周期,当你运行 mvn install 的时候被调用。这条命令告诉
      Maven 执行一系列的有序的步骤,直到到达你指定的生命周期。缺点是运行许多默认目标。
      而 ant 没有约定,项目生命周期,它是命令式的。所有操作都要手动去创建、布置。甚至连
      build.xml 文件都需要手动创建。
    3. Maven 仓库是什么
      Maven 仓库是基于简单文件系统存储的,集中化管理 Java API 资源(构件)的一个服务。
      仓库中的任何一个构件都有其唯一的坐标,根据这个坐标可以定义其在仓库中的唯一存储路
      径。得益于 Maven 的坐标机制,任何 Maven 项目使用任何一个构件的方式都是完全相同
      的,Maven 可以在某个位置统一存储所有的 Maven 项目共享的构件,这个统一的位置就
      是仓库,项目构建完毕后生成的构件也可以安装或者部署到仓库中,供其它项目使用。
      对于 Maven 来说,仓库分为两类:本地仓库和远程仓库。
    4. Maven 的工程类型有哪些?
      POM 工程
      POM 工程是逻辑工程。用在父级工程或聚合工程中。用来做 jar 包的版本控制。
      JAR 工程
      将会打包成 jar 用作 jar 包使用。即常见的本地工程 - Java Project。
      WAR 工程
      将会打包成 war,发布在服务器上的工程。如网站或服务。即常见的网络工程 -
      Dynamic Web Project。war 工程默认没有 WEB-INF 目录及 web.xml 配置文件,IDE
      通常会显示工程错误,提供完整工程结构可以解决。
    5. Maven 常用命令有哪些?
      install
      本地安装, 包含编译,打包,安装到本地仓库
      编译 - javac
      打包 - jar, 将 java 代码打包为 jar 文件
      安装到本地仓库 - 将打包的 jar 文件,保存到本地仓库目录中。
      clean
      清除已编译信息。
      删除工程中的 target 目录。
      compile
      只编译。 javac 命令
      deploy
      部署。 常见于结合私服使用的命令。
      相当于是 install+上传 jar 到私服。
      包含编译,打包,安装到本地仓库,上传到私服仓库。
      package
      打包。 包含编译,打包两个功能。
    6. ZooKeeper 的作用是什么?
      配置管理
      在我们的应用中除了代码外,还有一些就是各种配置。比如数据库连接等。一般我们
      都是使用配置文件的方式,在代码中引入这些配置文件。当我们只有一种配置,只有一
      台服务器,并且不经常修改的时候,使用配置文件是一个很好的做法,但是如果我们配
      置非常多,有很多服务器都需要这个配置,这时使用配置文件就不是个好主意了。这个
      时候往往需要寻找一种集中管理配置的方法,我们在这个集中的地方修改了配置,所有
      对这个配置感兴趣的都可以获得变更。Zookeeper 就是这种服务,它使用 Zab 这种一致
      性协议来提供一致性。现在有很多开源项目使用 Zookeeper 来维护配置,比如在 HBase
      中,客户端就是连接一个 Zookeeper,获得必要的 HBase 集群的配置信息,然后才可
      以进一步操作。还有在开源的消息队列 Kafka 中,也使用 Zookeeper 来维护 broker 的
      信息。在 Alibaba 开源的 SOA 框架 Dubbo 中也广泛的使用 Zookeeper 管理一些配置
      来实现服务治理。
      名字服务
      名字服务这个就很好理解了。比如为了通过网络访问一个系统,我们得知道对方的
      IP 地址,但是 IP 地址对人非常不友好,这个时候我们就需要使用域名来访问。但是计算
      机是不能是域名的。怎么办呢?如果我们每台机器里都备有一份域名到 IP 地址的映射,
      这个倒是能解决一部分问题,但是如果域名对应的 IP 发生变化了又该怎么办呢?于是我
      们有了 DNS 这个东西。我们只需要访问一个大家熟知的(known)的点,它就会告诉你这
      个域名对应的 IP 是什么。在我们的应用中也会存在很多这类问题,特别是在我们的服务
      特别多的时候,如果我们在本地保存服务的地址的时候将非常不方便,但是如果我们只
      需要访问一个大家都熟知的访问点,这里提供统一的入口,那么维护起来将方便得多了。
      分布式锁
      其实在第一篇文章中已经介绍了 Zookeeper 是一个分布式协调服务。这样我们就可
      以利用 Zookeeper 来协调多个分布式进程之间的活动。比如在一个分布式环境中,为了
      提高可靠性,我们的集群的每台服务器上都部署着同样的服务。但是,一件事情如果集
      群中的每个服务器都进行的话,那相互之间就要协调,编程起来将非常复杂。而如果我
      们只让一个服务进行操作,那又存在单点。通常还有一种做法就是使用分布式锁,在某
      个时刻只让一个服务去干活,当这台服务出问题的时候锁释放,立即 fail over 到另外的
      服务。这在很多分布式系统中都是这么做,这种设计有一个更好听的名字叫 Leader
      Election(leader 选举)。比如 HBase 的 Master 就是采用这种机制。但要注意的是分布
      式锁跟同一个进程的锁还是有区别的,所以使用的时候要比同一个进程里的锁更谨慎的
      使用。
      集群管理
      在分布式的集群中,经常会由于各种原因,比如硬件故障,软件故障,网络问题,有
      些节点会进进出出。有新的节点加入进来,也有老的节点退出集群。这个时候,集群中其
      他机器需要感知到这种变化,然后根据这种变化做出对应的决策。比如我们是一个分布式
      存储系统,有一个中央控制节点负责存储的分配,当有新的存储进来的时候我们要根据现
      在集群目前的状态来分配存储节点。这个时候我们就需要动态感知到集群目前的状态。还
      有,比如一个分布式的 SOA 架构中,服务是一个集群提供的,当消费者访问某个服务时,
      就需要采用某种机制发现现在有哪些节点可以提供该服务(这也称之为服务发现,比如
      Alibaba 开源的 SOA 框架 Dubbo 就采用了 Zookeeper 作为服务发现的底层机制)。还
      有开源的 Kafka 队列就采用了 Zookeeper 作为 Cosnumer 的上下线管理。
    7. 什么是 Znode? 在 Zookeeper 中,znode 是一个跟 Unix 文件系统路径相似的节点,可以往这个节
      点存储或获取数据。
      Zookeeper 底层是一套数据结构。这个存储结构是一个树形结构,其上的每一个节
      点,我们称之为“znode”
      zookeeper 中的数据是按照“树”结构进行存储的。而且 znode 节点还分为 4 中不
      同的类型。
      每一个 znode 默认能够存储 1MB 的数据(对于记录状态性质的数据来说,够了)
      可以使用 zkCli 命令,登录到 zookeeper 上,并通过 ls、create、delete、get、set
      等命令操作这些 znode 节点
    8. Znode 节点类型有哪些?
      答:
      (1)PERSISTENT 持久化节点: 所谓持久节点,是指在节点创建后,就一直存在,直
      到有删除操作来主动清除这个节点。否则不会因为创建该节点的客户端会话失效而消失。
      (2)PERSISTENT_SEQUENTIAL 持久顺序节点:这类节点的基本特性和上面的节点
      类型是一致的。额外的特性是,在 ZK 中,每个父节点会为他的第一级子节点维护一份
      时序,会记录每个子节点创建的先后顺序。基于这个特性,在创建子节点的时候,可以
      尚学堂 Java 面试题大全及参考答案
      设置这个属性,那么在创建节点过程中,ZK 会自动为给定节点名加上一个数字后缀,作
      为新的节点名。这个数字后缀的范围是整型的最大值。 在创建节点的时候只需要传入节
      点 “/test_”,这样之后,zookeeper 自动会给”test_”后面补充数字。
      (3)EPHEMERAL 临时节点:和持久节点不同的是,临时节点的生命周期和客户端会
      话绑定。也就是说,如果客户端会话失效,那么这个节点就会自动被清除掉。注意,这
      里提到的是会话失效,而非连接断开。另外,在临时节点下面不能创建子节点。
      这里还要注意一件事,就是当你客户端会话失效后,所产生的节点也不是一下子就消
      失了,也要过一段时间,大概是 10 秒以内,可以试一下,本机操作生成节点,在服务器
      端用命令来查看当前的节点数目,你会发现客户端已经 stop,但是产生的节点还在。
      EPHEMERAL_SEQUENTIAL 临时自动编号节点:此节点是属于临时节点,不过带有
      顺序,客户端会话结束节点就消失。
    9. 什么是 Dubbo?
      Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能
      的 RPC 实现服务的输出和输入功能,可以和 Spring 框架无缝集成。Dubbo 框架,是基
      于容器运行的.。容器是 Spring。
      其核心部分包含:
    10. 远程通讯: 提供对多种基于长连接的 NIO 框架抽象封装,包括多种线程模型,序
      列化,以及“请求-响应”模式的信息交换方式。
    11. 集群容错: 提供基于接口方法的透明远程过程调用,包括多协议支持,以及软负载
      均衡,失败容错,地址路由,动态配置等集群支持。
    12. 自动发现: 基于注册中心目录服务,使服务消费方能动态的查找服务提供方,使地
      址透明,使服务提供方可以平滑增加或减少机器。
      Dubbo 能做什么?
      1.透明化的远程方法调用,就像调用本地方法一样调用远程方法,只需简单配置,没
      有任何 API 侵入。
      2.软负载均衡及容错机制,可在内网替代 F5 等硬件负载均衡器,降低成本,减少单
      点。
    13. 服务自动注册与发现,不再需要写死服务提供方地址,注册中心基于接口名查询
      服务提供者的 IP 地址,并且能够平滑添加或删除服务提供者。
      Dubbo 的存在简单来说就是要减小 service 层的压力。
    14. 什么是 RPC 远程过程调用?
      远程过程调用协议,它是一种通过网络从远程计算机程序上请求服务,而不需要了解
      底层网络技术的协议。RPC 协议假定某些传输协议的存在,如 TCP 或 UDP,为通信程序
      之间携带信息数据。在 OSI 网络通信模型中,RPC 跨越了传输层和应用层。RPC 使得开
      发包括网络分布式多程序在内的应用程序更加容易。
    15. Dubbo 中有哪些角色?
      registry
      注册中心. 是用于发布和订阅服务的一个平台.用于替代 SOA 结构体系框架中的 ESB
      服务总线的。
      发布
      开发服务端代码完毕后, 将服务信息发布出去. 实现一个服务的公开.
      订阅
      客户端程序,从注册中心下载服务内容 这个过程是订阅.
      订阅服务的时候, 会将发布的服务所有信息,一次性下载到客户端.
      客户端也可以自定义, 修改部分服务配置信息. 如: 超时的时长, 调用的重试次数等. Consumer
      服务的消费者, 就是服务的客户端.
      消费者必须使用 Dubbo 技术开发部分代码. 基本上都是配置文件定义.
      provider
      服务的提供者, 就是服务端.
      服务端必须使用 Dubbo 技术开发部分代码. 以配置文件为主.
      container
      容器. Dubbo 技术的服务端(Provider), 在启动执行的时候, 必须依赖容器才能正常
      启动.
      默认依赖的就是 spring 容器. 且 Dubbo 技术不能脱离 spring 框架. 在 2.5.3 版本的 dubbo 中, 默认依赖的是 spring2.5 版本技术. 可以选用 spring4.5 以下
      版本.在 2.5.7 版本的 dubbo 中, 默认依赖的是 spring4.3.10 版本技术. 可以选择任意的
      spring 版本.
      monitor
      监控中心. 是 Dubbo 提供的一个 jar 工程.
      主要功能是监控服务端(Provider)和消费端(Consumer)的使用数据的. 如: 服务端是
      什么,有多少接口,多少方法, 调用次数, 压力信息等. 客户端有多少, 调用过哪些服务端,
      调用了多少次等.
    16. Dubbo 执行流程什么是?
      0 start: 启动 Spring 容器时,自动启动 Dubbo 的 Provider
      1、register: Dubbo 的 Provider 在启动后自动会去注册中心注册内容.注册的内容
      包括:
      1.1 Provider 的 IP
      1.2 Provider 的端口.
      1.3 Provider 对外提供的接口列表.哪些方法.哪些接口类
      1.4 Dubbo 的版本.
      1.5 访问 Provider 的协议. 2、subscribe: 订阅.当 Consumer 启动时,自动去 Registry 获取到所已注册的服务
      的信息. 3、notify: 通知.当 Provider 的信息发生变化时, 自动由 Registry 向 Consumer 推
      送通知. 4、invoke: 调用. Consumer 调用 Provider 中方法
      4.1 同步请求.消耗一定性能.但是必须是同步请求,因为需要接收调用方法后的
      结果. 5、count:次数. 每隔 2 分钟,provoider 和 consumer 自动向 Monitor 发送访问次
      数.Monitor 进行统计.
    17. 说说 Dubbo 支持的协议有哪些?
      1、Dubbo 协议(官方推荐协议)
      优点:
      采用 NIO 复用单一长连接,并使用线程池并发处理请求,减少握手和加大并发效率,
      性能较好(推荐使用)
      缺点:
      大文件上传时,可能出现问题(不使用 Dubbo 文件上传) 2、RMI(Remote Method Invocation)协议
      优点:
      JDK 自带的能力。可与原生 RMI 互操作,基于 TCP 协议
      缺点:
      偶尔连接失败. 3、Hessian 协议
      优点:
      可与原生 Hessian 互操作,基于 HTTP 协议
      缺点: 需 hessian.jar 支持,http 短连接的开销大
    18. Dubbo 支持的注册中心有哪些?
      1、Zookeeper(官方推荐)
      优点:支持分布式.很多周边产品.
      缺点: 受限于 Zookeeper 软件的稳定性.Zookeeper 专门分布式辅助软件,稳定较优
      2、Multicast
      优点:去中心化,不需要单独安装软件.
      缺点:Provider 和 Consumer 和 Registry 不能跨机房(路由) 3、Redis
      优点:支持集群,性能高
      缺点:要求服务器时间同步.否则可能出现集群失败问题. 4、Simple
      优点: 标准 RPC 服务.没有兼容问题
      缺点: 不支持集群.
    19. SessionFactory 是线程安全的吗?Session 是线程安全的吗,两个线程
      能够共享同一个 Session 吗?
      答:SessionFactory 对应 Hibernate 的一个数据存储的概念,它是线程安全的,可以被
      多个线程并发访问。SessionFactory 一般只会在启动的时候构建。对于应用程序,最好
      将 SessionFactory 通过单例的模式进行封装以便于访问。Session 是一个轻量级非线程
      安全的对象(线程间不能共享 session),它表示与数据库进行交互的一个工作单元。
      Session 是由 SessionFactory 创建的,在任务完成之后它会被关闭。Session 是持久层
      服务对外提供的主要接口。Session 会延迟获取数据库连接(也就是在需要的时候才会
      获取)。为了避免创建太多的 session,可以使用 ThreadLocal 来取得当前的 session,
      无论你调用多少次 getCurrentSession()方法,返回的都是同一个 session。
    20. Session 的 load 和 get 方法的区别是什么?
      答:主要有以下三项区别:
      1)如果没有找到符合条件的记录, get 方法返回 null,load 方法抛出异常
      2)get 方法直接返回实体类对象, load 方法返回实体类对象的代理
      3)在 Hibernate 3 之前,get 方法只在一级缓存(内部缓存)中进行数据查找, 如果没有
      找到对应的数据则越过二级缓存, 直接发出 SQL 语句完成数据读取; load 方法则可以充
      分利用二级缓存中的现有数据;当然从 Hibernate 3 开始,get 方法不再是对二级缓存
      只写不读,它也是可以访问二级缓存的
      简单的说,对于 load()方法 Hibernate 认为该数据在数据库中一定存在可以放心的使用
      代理来实现延迟加载,如果没有数据就抛出异常,而通过 get()方法去取的数据可以不存
      在。
    21. Session 的 save()、update()、merge()、lock()、saveOrUpdate()
      和 persist()方法有什么区别?
      答:Hibernate 的对象有三种状态:瞬态、持久态和游离态。游离状态的实例可以通过
      调用 save()、persist()或者 saveOrUpdate()方法进行持久化;脱管状态的实例可以通过
      调用 update()、0saveOrUpdate()、lock()或者 replicate()进行持久化。save()和 persist()
      将会引发 SQL 的 INSERT 语句,而 update()或 merge()会引发 UPDATE 语句。save()
      和 update()的区别在于一个是将瞬态对象变成持久态,一个是将游离态对象变为持久态。
      merge 方法可以完成 save()和 update()方法的功能,它的意图是将新的状态合并到已有
      的持久化对象上或创建新的持久化对象。按照官方文档的说明:(1)persist()方法把一个
      瞬态的实例持久化,但是并"不保证"标识符被立刻填入到持久化实例中,标识符的填入
      可能被推迟到 flush 的时间;(2) persist"保证",当它在一个事务外部被调用的时候并不
      触发一个 Insert 语句,当需要封装一个长会话流程的时候,一个 persist 这样的函数是
      需要的。(3)save"不保证"第 2 条,它要返回标识符,所以它会立即执行 Insert 语句,不管
      是不是在事务内部还是外部。update()方法是把一个已经更改过的脱管状态的对象变成
      持久状态;lock()方法是把一个没有更改过的脱管状态的对象变成持久状态。
    22. 什么是 VSFTPD?
      vsftpd 是“very secure FTP daemon”的缩写,安全性是它的一个最大的特点。
      vsftpd 是一个 UNIX 类操作系统上运行的服务器的名字,它可以运行在诸如 Linux、
      BSD、Solaris、 HP-UNIX 等系统上面,是一个完全免费的、开放源代码的 ftp 服务器
      软件,支持很多其他的 FTP 服务器所不支持的特征。
    23. 什么是 Nginx?
      Nginx (engine x) 是一个高性能的 HTTP 和反向代理服务。Nginx 是由伊戈尔·赛
      索耶夫为俄罗斯访问量第二的 Rambler.ru 站点(俄文:Рамблер)开发的,第一个公
      开版本 0.1.0 发布于 2004 年 10 月 4 日。
      Nginx 是一个很强大的高性能 Web 和反向代理服务,它具有很多非常优越的特性:
      在连接高并发的情况下,Nginx 是 Apache 服务不错的替代品:Nginx 在美国是做虚拟
      主机生意的老板们经常选择的软件平台之一。
    24. Nginx 有哪些作用?
      答:
      http 协议代理
      搭建虚拟主机
      服务的反向代理
      在反向代理中配置集群的负载均衡
    25. 什么是正向代理?
      正向代理,意思是一个位于客户端和原始服务器(origin server)之间的服务器,为了
      从原始服务器取得内容,客户端向代理发送一个请求并指定目标(原始服务器),然后代理
      向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。
    26. 什么是反向代理?
      反向代理(Reverse Proxy)方式是指以代理服务器来接受 internet 上的连接请求,
      然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 internet 上请
      求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。
    27. 什么是 Redis?
      答:
      Remote Dictionary Server(Redis)是一个开源的使用 ANSI C 语言编写、支持网络、
      可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。
      它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map),
      列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。
    28. Redis 的特点什么是?
    29. 支持多种数据结构,如 string(字符串)、 list(双向链表)、dict(hash 表)、set(集合)、
      zset(排序 set)、hyperloglog(基数估算)
    30. 支持持久化操作,可以进行 aof 及 rdb 数据持久化到磁盘,从而进行数据备份或数
      据恢复等操作,较好的防止数据丢失的手段。
    31. 支持通过 Replication 进行数据复制,通过 master-slave 机制,可以实时进行数据
      的同步复制,支持多级复制和增量复制,master-slave 机制是 Redis 进行 HA 的重要手段。
      单进程请求,所有命令串行执行,并发情况下不需要考虑数据一致性问题。
    32. Redis 数据类型有哪些?
      答:
      String(字符串)
      Hash(hash 表)
      List(链表)
      Set(集合)
      SortedSet(有序集合 zset)
    33. Redis 中的常用命令哪些?
      incr 让当前键值以 1 的数量递增,并返回递增后的值
      incrby 可以指定参数一次增加的数值,并返回递增后的值
      decr 让当前键值以 1 的数量递减 并返回递减后的值
      decrby 可以指定参数一次递减的数值,并返回递减后的值
      incrbyfloat 可以递增一个双精度浮点数
      append 作用是向键值的末尾追加 value。如果键不存在则将该键的值设置为 value。返
      回值是追加后字符串的总长度。
      mget/mset 作用与 get/set 相似,不过 mget/mset 可以同时获得/设置多个键的键值
      del 根据 key 来删除 value
      flushdb 清除当前库的所有数据
      hset 存储一个哈希键值对的集合
      hget 获取一个哈希键的值
      hmset 存储一个或多个哈希是键值对的集合
      hmget 获取多个指定的键的值
      hexists 判断哈希表中的字段名是否存在 如果存在返回 1 否则返回 0
      hdel 删除一个或多个字段
      hgetall 获取一个哈希是键值对的集合
      hvals 只返回字段值
      hkeys 只返回字段名
      hlen 返回 key 的 hash 的元素个数
      lpush key value 向链表左侧添加
      rpush key value 向链表右侧添加
      lpop key 从左边移出一个元素
      rpop key 从右边移出一个元素
      llen key 返回链表中元素的个数 相当于关系型数据库中 select count()
      lrange key start end lrange 命令将返回索引从 start 到 stop 之间的所有元素。Redis
      的列表起始索引为 0。
      lrange 也支持负索引 lrange nn -2 -1 如 -1 表示最右边第一个元素 -2 表示最右边第
      二个元素,依次类推。
      lindex key indexnumber 如果要将列表类型当做数组来用,lindex 命令是必不可少的。
      lindex 命令用来返回指定索引的元素,索引从 0 开始
      如果是负数表示从右边开始计算的索引,最右边元素的索引是-1。
      Lset key indexnumber value 是另一个通过索引操作列表的命令,它会将索引为
      index 的元素赋值为 value。
      sadd key value 添加一个 string 元素到,key 对应的 set 集合中,成功返回 1,如果元素已
      经在集合中返回 0
      scard key 返回 set 的元素个数,如果 set 是空或者 key 不存在返回 0
      smembers key 返回 key 对应 set 的所有元素,结果是无序的
      sismember key value 判断 value 是否在 set 中,存在返回 1,0 表示不存在或者 key
      不存在
      srem key value 从 key 对应 set 中移除给定元素,成功返回 1,如果 value 在集合中不
      存在或者 key 不存在返回 0
      zadd key score value 将一个或多个 value 及其 socre 加入到 set 中
      zrange key start end 0 和-1 表示从索引为 0 的元素到最后一个元素(同 LRANGE 命
      令相似)
      zrange key 0 -1 withscores 也可以连同 score 一块输出,使用 WITHSCORES 参数
      zremrangebyscore key start end 可用于范围删除操作
      ping 测试 redis 是否链接 如果已链接返回 PONG
      echo value 测试 redis 是否链接 如果已链接返回 echo 命令后给定的值
      keys * 返回所有的 key 可以加
      通配
      exists key 判断 string 类型一个 key 是否存在 如果存在返回 1 否则返回 0
      expire key time(s) 设置一个 key 的过期时间 单位秒。时间到达后会删除 key 及 value
      ttl key 查询已设置过期时间的 key 的剩余时间 如果返回-2 表示该键值对已经被删除
      persist 移除给定 key 的过期时间
      select dbindex 选择数据库(0-15)
      move key dbIndex 将当前数据库中的 key 转移到其他数据库中
      dbsize 返回当前数据库中的 key 的数目
      info 获取服务器的信息和统计
      flushdb 删除当前选择的数据库中的 key
      flushall 删除所有数据库中的所有 key
      quit 退出连接
    34. Redis 的配置以及持久化方案有几种?
      答:以下两种
      RDB 方式
      AOF 方式
    35. 什么是 RDB 方式?
      答:是 RDB 是对内存中数据库状态进行快照
      RDB 方式:将 Redis 在内存中的数据库状态保存到磁盘里面,RDB 文件是一个经过
      压缩的二进制文件,通过该文件可以还原生成 RDB 文件时的数据库状态(默认下,持久
      化到 dump.rdb 文件,并且在 redis 重启后,自动读取其中文件,据悉,通常情况下一
      千万的字符串类型键,1GB 的快照文件,同步到内存中的 时间是 20-30 秒)
      RDB 的生成方式:
      1、执行命令手动生成
      有两个 Redis 命令可以用于生成 RDB 文件,一个是 SAVE,另一个是 BGSAVE SAVE 命
      令会阻塞 Redis 服务器进程,直到 RDB 文件创建完毕为止,在服务器进程阻塞期间,服
      务器不能处理任何命令请求,BGSAVE 命令会派生出一个子进程,然后由子进程负责创
      建 RDB 文件,服务器进程(父进程)继续处理命令请求,创建 RDB 文件结束之前,客
      户端发送的 BGSAVE 和 SAVE 命令会被服务器拒绝
      2、通过配置自动生成
      可以设置服务器配置的 save 选项,让服务器每隔一段时间自动执行一次 BGSAVE
      命令,可以通过 save 选项设置多个保存条件,但只要其中任意一个条件被满足,服务器
      就会执行 BGSAVE 命令
      例如:
      save 900 1
      save 300 10
      save 60 10000
      那么只要满足以下三个条件中的任意一个,BGSAVE 命令就会被执行
      服务器在 900 秒之内,对数据库进行了至少 1 次修改
      服务器在 300 秒之内,对数据库进行了至少 10 次修改
      服务器在 60 秒之内,对数据库进行了至少 10000 次修改
    36. 什么是 AOF 方式?
      AOF 持久化方式在 redis 中默认是关闭的,需要修改配置文件开启该方式。
      355
      尚学堂 Java 面试题大全及参考答案
      AOF:把每条命令都写入文件,类似 mysql 的 binlog 日志
      AOF 方式:是通过保存 Redis 服务器所执行的写命令来记录数据库状态的文件。
      AOF 文件刷新的方式,有三种:
      appendfsync always - 每提交一个修改命令都调用 fsync 刷新到 AOF 文件,非常
      非常慢,但也非常安全
      appendfsync everysec - 每秒钟都调用 fsync 刷新到 AOF 文件,很快,但可能会
      丢失一秒以内的数据
      appendfsync no - 依靠 OS 进行刷新,redis 不主动刷新 AOF,这样最快,但安全
      性就差
      默认并推荐每秒刷新,这样在速度和安全上都做到了兼顾
      AOF 数据恢复方式
      服务器在启动时,通过载入和执行 AOF 文件中保存的命令来还原服务器关闭之前的数据
      库状态,具体过程:
      载入 AOF 文件
      创建模拟客户端
      从 AOF 文件中读取一条命令
      使用模拟客户端执行命令
      循环读取并执行命令,直到全部完成
      如果同时启用了 RDB 和 AOF 方式,AOF 优先,启动时只加载 AOF 文件恢复数据
    37. 什么是全文检索?
      答:什么叫做全文检索呢?这要从我们生活中的数据说起。
      我们生活中的数据总体分为两种:结构化数据和非结构化数据。
      1)结构化数据:指具有固定格式或有限长度的数据,如数据库,元数据等。
      2)非结构化数据:指不定长或无固定格式的数据,如邮件,word 文档等。
      非结构化数据又一种叫法叫全文数据。
      按照数据的分类,搜索也分为两种:
      1)对结构化数据的搜索:如对数据库的搜索,用 SQL 语句。
      2)对非结构化数据的搜索:如利用 windows 的搜索也可以搜索文件内容,
      全文检索: 就是一种将文件中所有文本与检索项匹配的文字资料检索方法。全文检索首
      先将要查询的目标文档中的词提取出来,组成索引,通过查询索引达到搜索目标文档的
      目的。这种先建立索引,再对索引进行搜索的过程就叫全文检索(Full-text Search)。
    38. 什么是 Lucene?
      Lucene 是一个高效的,基于 Java 的全文检索库。
      Lucene 是 apache 软件基金会 4 jakarta 项目组的一个子项目,是一个开放源代码
      的全文检索引擎工具包,但它不是一个完整的全文检索引擎,而是一个全文检索引擎的
      架构,Lucene 的目的是为软件开发人员提供一个简单易用的工具包,以方便的在目标系
      统中实现全文检索的功能,或者是以此为基础建立起完整的全文检索引擎。Lucene 是一
      套用于全文检索和搜寻的开源程序库,由 Apache 软件基金会支持和提供。Lucene 提供
      了一个简单却强大的应用程序接口,能够做全文索引和搜寻。在 Java 开发环境里 Lucene
      是一个成熟的免费开源工具。就其本身而言,Lucene 是当前以及最近几年最受欢迎的免
      费 Java 信息检索程序库。
    39. 什么是 Solr?
      答:Solr 是一个独立的企业级搜索应用服务器,它对外提供类似于 Web-service 的 API
      接口。
      Solr 是一个高性能,采用 Java 开发,基于 Lucene 的全文搜索服务器。同时对其进
      行了扩展,提供了比 Lucene 更为丰富的查询语言,同时实现了可配置、可扩展并对查
      询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文检索
      引擎。
      文档通过 Http 利用 XML 加到一个搜索集合中。查询该集合也是通过 http 收到一
      个 XML/JSON 响应来实现。它的主要特性包括:高效、灵活的缓存功能,垂直搜索功能,
      高亮显示搜索结果,通过索引复制来提高可用性,提供一套强大 Data Schema 来定义
      字段,类型和设置文本分析,提供基于 Web 的管理界面等。
    40. Solr 是由哪两个部分构成?
      答:如下两个部分
      Solr 的 web 服务
      Solr 的索引库
    41. 什么是正排索引?
      正排索引是以文档的 ID 为关键字,索引文档中每个字的位置信息,查找时扫描索引中每
      个文档中字的信息直到找出所有包含查询关键字的文档。
      但是在查询的时候需对所有的文档进行扫描以确保没有遗漏,这样就使得检索时间大大
      延长,检索效率低下。
      尽管正排索引的工作原理非常的简单,但是由于其检索效率太低,除非在特定情况下,
      否则实用性价值不大。
    42. 什么是倒排索引?
      对数据进行分析,抽取出数据中的词条,以词条作为 key,对应数据的存储位置作为 value,
      实现索引的存储。这种索引称为倒排索引。
      当 solr 存储文档时,solr 会首先对文档数据进行分词,创建索引库和文档数据库。所谓
      的分词是指:将一段字符文本按照一定的规则分成若干个单词。
    43. 什么是 ActiveMQ?
      ActiveMQ 是一种开源的,实现了 JMS1.1 规范的,面向消息(MOM)的中间件,为应用
      程序提供高效的、可扩展的、稳定的和安全的企业级消息通信。ActiveMQ 使用 Apache 提
      供的授权,任何人都可以对其实现代码进行修改。
      ActiveMQ 的设计目标是提供标准的,面向消息的,能够跨越多语言和多系统的应用集成
      消息通信中间件。
      ActiveMQ 实现了 JMS 标准并提供了很多附加的特性。这些附加的特性包括,JMX 管理
      (java Management Extensions,即 java 管理扩展),主从管理(master/salve,这是集
      群模式的一种,主要体现在可靠性方面,当主中介(代理)出现故障,那么从代理会替代主
      代理的位置,不至于使消息系统瘫痪)、消息组通信(同一组的消息,仅会提交给一个客户进
      行处理)、有序消息管理(确保消息能够按照发送的次序被接受者接收)。消息优先级(优先
      级高的消息先被投递和处理)、订阅消息的延迟接收(订阅消息在发布时,如果订阅者没有开
      启连接,那么当订阅者开启连接时,消息中介将会向其提交之前的,其未处理的消息)、接收
      者处理过慢(可以使用动态负载平衡,将多数消息提交到处理快的接收者,这主要是对 PTP
      消息所说)、虚拟接收者(降低与中介的连接数目)、成熟的消息持久化技术(部分消息需要
      持久化到数据库或文件系统中,当中介崩溃时,信息不会丢失)、支持游标操作(可以处理大
      消息)、支持消息的转换、通过使用 Apache 的 Camel 可以支持 EIP、使用镜像队列的形式
      轻松的对消息队列进行监控等。
    44. 消息服务的应用场景有哪些?
      答:如下 3 个场景都可以使用消息服务
      1、异步处理
      2、应用的解耦
      3、流量的削峰
    45. 什么是 JMS?
      JMS(Java Messaging Service)是 Java 平台上有关面向消息中间件的技术规范,它便
      于消息系统中的 Java 应用程序进行消息交换,并且通过提供标准的产生、发送、接收消息的
      接口,简化企业应用的开发。
    46. JMS 有哪些模型?
      答:
      JMS 消息机制主要分为两种模型:PTP 模型和 Pub/Sub 模型。
      1、PTP 模型:(Point to Point 对点模型) 每一个消息传递给一个消息消费者,保证
      消息传递给消息消费者,且消息不会同时被多个消费者接收。如果消息消费者暂时不在连接
      范围内,JMS 会自动保证消息不会丢失,直到消息消费者进入连接,消息将自动送达。因此,
      JMS 需要将消息保存到永久性介质上,例如数据库或者文件。
      2、Pub-Sub 模型:(publish-subscription 发布者订阅者模型)每个主题可以拥有多个
      订阅者。JMS 系统负责将消息的副本传给该主题的每个订阅者。
      如果希望每一条消息都能够被处理,那么应该使用 PTP 消息模型。如果并不要求消息
      都必须被消息消费者接收到的情况下,可使用 pub-sub 消息模型。Pub-Sub 模型可以在一
      对多的消息广播时使用。
    47. 什么是 JsonP?
      Jsonp(JSON with Padding) 是 json 的一种"使用模式",可以让网页从别的域名(网
      站)那获取资料,即跨域读取数据。
    48. 什么是跨域?
      跨域是指一个域(网站)下的文档或脚本试图去请求另一个域(网站)下的资源。
    49. 什么是同源策略?
      同源策略/SOP(Same origin policy)是一种约定,由 Netscape 公司 1995 年引入浏
      览器,它是浏览器最核心也最基本的安全功能,现在所有支持 JavaScript 的浏览器都会使用
      这个策略。如果缺少了同源策略,浏览器很容易受到 XSS、CSFR 等攻击。所谓同源是指"协 议+域名+端口"三者相同,即便两个不同的域名指向同一个 ip 地址,也非同源
    50. 什么是 MyCat?
      MyCat 是目前最流行的基于 java 语言编写的数据库中间件,是一个实现了 MySQL 协议
      的服务器,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,
      而其后端可以用 MySQL 原生协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多
      数主流数据库服务器通信,其核心功能是分库分表。配合数据库的主从模式还可实现读写分
      离。
      MyCat 是基于阿里开源的 Cobar 产品而研发,Cobar 的稳定性、可靠性、优秀的架构
      和性能以及众多成熟的使用案例使得 MyCat 变得非常的强大。
      MyCat 发展到目前的版本,已经不是一个单纯的 MySQL 代理了,它的后端可以支持
      MySQL、SQL Server、Oracle、DB2、PostgreSQL 等主流数据库,也支持 MongoDB 这
      种新型 NoSQL 方式的存储,未来还会支持更多类型的存储。而在最终用户看来,无论是那
      种存储方式,在 MyCat 里,都是一个传统的数据库表,支持标准的 SQL 语句进行数据的操
      作,这样一来,对前端业务系统来说,可以大幅降低开发难度,提升开发速度。
    51. 什么是纵向切分/垂直切分?
      就是把原本存储于一个库的数据存储到多个库上。
      由于对数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的
      问题。
      例如,我们会建立定义数据库 workDB、商品数据库 payDB、用户数据库 userDB、日
      志数据库 logDB 等,分别用于存储项目数据定义表、商品定义表、用户数据表、日志数据表
      等。
      优点
      1)减少增量数据写入时的锁对查询的影响。
      2)由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询
      所需的检索行数变少,减少了磁盘 IO,时延变短。
      缺点:无法解决单表数据量太大的问题。
      横向切分/水平切分
      把原本存储于一个表的数据分块存储到多个表上。当一个表中的数据量过大时,我们可
      以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表,和不同的库上。
      例如,我们 userDB 中的 userTable 中数据量很大,那么可以把 userDB 切分为结构相
      同的多个 userDB:part0DB、part1DB 等,再将 userDB 上的 userTable,切分为很多
      userTable:userTable0、userTable1 等,然后将这些表按照一定的规则存储到多个 userDB
      上。
      优点:
      1)单表的并发能力提高了,磁盘 I/O 性能也提高了。
      2)如果出现高并发的话,总表可以根据不同的查询,将并发压力分到不同的小表里面。
      缺点:无法实现表连接查询。
    52. 简述 Tomcat,Apache,JBoss 和 WebLogic 的区别和联系
      答:
      Apache:全球应用最广泛的 http 服务器,免费,出自 apache 基金组织
      Tomcat:应用也算非常广泛的 web 服务器,支持部分 j2ee,免费,出自 apache 基金
      组织
      JBoss:开源的应用服务器,比较受人喜爱,免费(文档要收费)
      weblogic:应该说算是业界第一的 app server,全部支持 j2ee1.4(收费)
      JBoss 也支持 j2ee
      JBoss 和 WebLogic 都含有 Jsp 和 Servlet 容器,也就可以做 web 容器,
      JBoss 和 WebLogic 也包含 EJB 容器,是完整的 J2EE 应用服务器
      tomcat 只能做 jsp 和 servlet 的 container
    53. 以下可以实现负载均衡的是()
      A. nagios
      B. Jenkins
      C. nginx
      D. docker
      分析:答案: C Nginx 是一款轻量级的 Web 服务器/反向代理服务器
      及电子邮件(IMAP/POP3)代理服务器,并在一个 BSD-like 协议下发行。
      其特点是占有内存少,并发能力强,事实上 nginx 的并发能力确实在同类
      型的网页服务器中表现较好,中国大陆使用 nginx 网站用户有:百度、京 东、新浪、网易、腾讯、淘宝等
    54. Tomcat/ WebSphere/WebLogic 的作用和特点
      作用:
      Tomcat:目前应用非常广泛的免费 web 服务器,支持部分 j2ee。
      WebSphere:是 IBM 集成软件平台。可做 web 服务器,WebSphere 提供了可靠、灵
      活和健壮的集成软件。
      Weblogic:是美国 bea 公司出品的一个基于 j2ee 架构的中间件。BEA WebLogic 是用
      于开发、集成、部署和管理大型分布式 Web 应用、网络应用和数据库应用的 Java 应用
      服务器。
      特点(区别):
      1)价位不同:Tomcat 的是免费的;WebLogic 与 WebSphere 是收费的,而且价格不
      菲。
      2)开源性不同:Tomcat 的是完全开源的,而其他两个不是。WebLogic 与 WebSphere
      都是对业内多种标准的全面支持,包括 JSB、JMS、JDBC、XML 和 WML,使 Web 应
      用系统实施更简单,且保护投资,同时也使基于标准的解决方案的开发更加简便。
      3)扩展性的不同:WebLogic 和 WebSphere 都是以其高扩展的架构体系闻名于业内,
      包括客户机连接的共享、资源 pooling 以及动态网页。
      4)应用范围的区别:Tomcat 是一个小型的轻量级应用服务器,在中小型系统和并发
      访问用户不是很多的场合下被普遍使用,是开发和调试 JSP 程序的首选。WebLogic 和
      WebSphere 是商业软件,功能齐全强大,主要应用于大型企业的大型项目。
      5)安全性问题区别:因为 Tomcat 是开源的,所以它们的安全性相对来说比较低,万
      一应用服务器本身有什么漏洞,你是没办法向 Apache 索赔的。而 WebLogic 和
      WebSphere 其容错、系统管理和安全性能已经在全球数以千记的关键任务环境中得以验
      证。
    55. B/S 和 C/S 的含义及其区别
      C/S 结构,即 Client/Server(客户机/服务器)结构,通过将任务合理分配到 Client 端和
      Server 端,降低了系统的通讯开销,可充分利用两端硬件环境优势。早期软件系统多以
      此作为首选设计标准。
      B/S 结构,即 Browser/Server(浏览器/服务器)结构,是随着 Internet 技术的兴起,对
      C/S 结构的一种变化或者改进的结构。在这种结构下,用户界面完全通过 WWW 浏览器
      实现,一部分事务逻辑在前端实现,但是主要事务逻辑在服务器端实现,节约了开发成
      本,便于软件维护。
      区别
      1、C/S 是建立在局域网的基础上的。B/S 是建立在广域网的基础上的,但并不是说 B/S
      结构不能在局域网上使用。
      2、B/S 业务扩展简单方便,通过增加页面即可增加服务器功能。C/S 的客户端还需要安
      装专用的客户端软件,不利于扩展。
      3、B/S 维护简单方便。开发、维护等几乎所有工作也都集中在服务器端,当企业对网络
      应用进行升级时,只需更新服务器端的软件就可以,这减轻了异地用户系统维护与升级
      的成本。。
      4、B/S 响应速度不及 C/S; 5、B/S 用户体验效果不是很理想
    56. 说说你对容器的理解
      容器也是 java 程序,它的主要作用是为应用程序提供运行环境。容器用来接管安全性、
      并发性、事务处理、交换到辅助存储器和其它服务的责任
      以 tomcat 为例:Tomcat 是一个后台服务进程,其它的 servlet(相当于 DLL)是在 Tomcat
      容器内运行,Broswer 只与 Tomcat 通迅; Tomcat 接受 browser 的请求,经过一系列
      动作(如果是静态网页,那么装载,按 http 协议形成响应流;如果是动态的如 JSP,那就
      要调用 JDK 中的 servlet.jsp 接口,解释形成静态网页,按 http 协议生成响应流发送回
      browser)后,形成静态网页,返回响应。
    57. 为什么要使用连接池?
      • 传统的数据库连接方式
      一个连接对象对应一个物理连接
      每次操作都打开一个物理连接,
      使用完都关闭连接,造成系统性能低下。
      • 连接池技术
      客户程序得到的连接对象是连接池中物理连接的一个句柄,调用连接对象的 close()方法,
      物理连接并没有关闭,数据源的实现只是删除了客户程序中的连接对象和池中的连接对
      象之间的联系. • 数据库连接的建立及关闭是耗费系统资源的操作,在大型应用中对系统的性能影响尤
      为明显。为了能重复利用数据库连接对象,缩短请求的响应时间和提高服务器的性能,支
      持更多的客户,应采用连接池技术.
    58. 数据库连接池的原理
      数据库连接池的原理
      传统连接方式:
      首先调用 Class.forName()方法加载数据库驱动,
      然后调用 DriverManager.getConnection()方法建立连接.
      连接池技术:
      连接池解决方案是在应用程序启动时就预先建立多个数据库连接对象,然后将连接对象保
      存到连接池中。
      当客户请求到来时,从池中取出一个连接对象为客户服务。
      当请求完成时,客户程序调用 close()方法,将连接对象放回池中.
      对于多于连接池中连接数的请求,排队等待。
      应用程序还可根据连接池中连接的使用率,动态增加或减少池中的连接数。
    59. MVC 模式及其优缺点
      一、MVC 原理
      MVC 是一种程序开发设计模式,它实现了显示模块与功能模块的分离。提高了程序的可维
      护性、可移植性、可扩展性与可重用性,降低了程序的开发难度。它主要分模型、视图、
      控制器三层。
      1、模型(model)它是应用程序的主体部分,主要包括业务逻辑模块和数据模块。模型与
      数据格式无关,这样一个模型能为多个视图提供数据。由于应用于模型的代码只需写一
      次就可以被多个视图重用,所以减少了代码的重复性
      2、视图(view) 用户与之交互的界面、在 web 中视图一般由 jsp,html 组成
      3、控制器(controller)接收来自界面的请求 并交给模型进行处理 在这个过程中控制器不
      尚学堂 Java 面试题大全及参考答案
      做任何处理只是起到了一个连接的作用
      二、MVC 的优点
      1、降低代码耦合性。在 MVC 模式中,三个层各施其职,所以如果一旦哪一层的需求发
      生了变化,就只需要更改相应的层中的代码而不会影响到其他层中的代码。
      2、有利于分工合作。在 MVC 模式中,由于按层把系统分开,那么就能更好的实现开发
      中的分工。网页设计人员可进行开发视图层中的 JSP,而对业务熟悉的人员可开发业务层,
      而其他开发人员可开发控制层。
      3、有利于组件的重用。如控制层可独立成一个能用的组件,表示层也可做成通用的操作
      界面。可以为一个模型在运行时同时建立和使用多个视图。
      三、MVC 的不足之处
      1、增加了系统结构和实现的复杂性。对于简单的界面,严格遵循 MVC,使模型、视图
      与控制器分离,会增加结构的复杂性,并可能产生过多的更新操作,降低运行效率。
      2、视图与控制器间的过于紧密的连接。视图与控制器是相互分离,但确实联系紧密的部
      件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立
      重用。
      3、视图对模型数据的低效率访问。依据模型操作接口的不同,视图可能需要多次调用才
      能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。
      4、目前,一般高级的界面工具或构造器不支持模式。改造这些工具以适应 MVC 需要和
      建立分离的部件的代价是很高的,从而造成 MVC 使用的困难。
    60. MVC 模式完成分页功能的基本思路是什么?
      1)页面提交页码(第几页)到 Servlet 中
      2)Servlet 接收到页码后,将页码传递给分页工具类(PageBean)
      3)Servlet 中调用 Service 层传入 PageBean 对象
      4)Service 层调用 DAO 层传入 PageBean 对象
      5)Servlet 中得到查询出来的数据,并 setAttrivute 保存
      6)在页面中得到(getAttribute)数据,遍历输出
    61. 常用的 Web 容器
      答: Unix 和 Linux 平台下使用最广泛的免费 HTTP 服务器是 Apache 服务器,而
      Windows 平台的服务器通常使用 IIS 作为 Web 服务器。选择 Web 服务器应考虑的因
      素有:性能、安全性、日志和统计、虚拟主机、代理服务器、缓冲服务和集成应用程序
      等。下面是对常用服务器的简介:
      IIS:Microsoft 的 Web 服务器产品为 Internet Information Services。IIS 是允许在公
      共 Intranet 或 Internet 上发布信息的 Web 服务器。IIS 是目前最流行的 Web 服务器产
      品之一,很多著名的网站都是建立在 IIS 的平台上。IIS 提供了一个图形界面的管理工具,
      称为 Internet 服务管理器,可用于监视配置和控制 Internet 服务。IIS 是一种 Web 服务
      组件,其中包括 Web 服务器、FTP 服务器、NNTP 服务器和 SMTP 服务器,分别用于
      网页浏览、文件传输、新闻服务和邮件发送等方面,它使得在网络(包括互联网和局域
      网)上发布信息成了一件很容易的事。它提供 ISAPI(Intranet Server API)作为扩展
      Web 服务器功能的编程接口;同时,它还提供一个 Internet 数据库连接器,可以实现对
      数据库的查询和更新。
      Kangle:Kangle Web 服务器是一款跨平台、功能强大、安全稳定、易操作的高性能
      Web 服务器和反向代理服务器软件。此外,Kangle 也是一款专为做虚拟主机研发的 Web
      服务器。实现虚拟主机独立进程、独立身份运行。用户之间安全隔离,一个用户出问题
      不影响其他用户。支持 PHP、ASP、ASP.NET、Java、Ruby 等多种动态开发语言。
      WebSphere:WebSphere Application Server 是功能完善、开放的 Web 应用程序服
      务器,是 IBM 电子商务计划的核心部分,它是基于 Java 的应用环境,用于建立、部署
      和管理 Internet 和 Intranet Web 应用程序,适应各种 Web 应用程序服务器的需要,
      范围从简单到高级直到企业级。
      WebLogic:BEA WebLogic Server 是一种多功能、基于标准的 Web 应用服务器,为
      企业构建自己的应用提供了坚实的基础。各种应用开发、部署所有关键性的任务,无论
      是集成各种系统和数据库,还是提交服务、跨 Internet 协作,Weblogic 都提供了相应
      的支持。由于它具有全面的功能、对开放标准的遵从性、多层架构、支持基于组件的开
      发,基于 Internet 的企业都选择它来开发、部署最佳的应用。BEA WebLogic Server
      在使应用服务器成为企业应用架构的基础方面一直处于领先地位,为构建集成化的企业
      级应用提供了稳固的基础,它们以 Internet 的容量和速度,在连网的企业之间共享信息、
      提交服务,实现协作自动化。
      Apache:目前 Apache 仍然是世界上用得最多的 Web 服务器,市场占有率约为 60%左
      右。世界上很多著名的网站都是 Apache 的产物,它的成功之处主要在于它的源代码开
      放、有一支强大的开发团队、支持跨平台的应用(可以运行在几乎所有的Unix、Windows、
      Linux 系统平台上)以及它的可移植性等方面。
      Tomcat:Tomcat 是一个开放源代码、运行 Servlet 和 JSP 的容器。TomcatServer 实
      现了 Servlet 和 JSP 规范。此外,Tomcat 还实现了 Apache-Jakarta 规范而且比绝大多
      数商业应用软件服务器要好,因此目前也有不少的 Web 服务器都选择了 Tomcat。
      Nginx:读作"engine x",是一个高性能的 HTTP 和反向代理服务器,也是一个
      IMAP/POP3/SMTP 代理服务器。 Nginx 是由 Igor Sysoev 为俄罗斯访问量第二的
      Rambler.ru 站点开发的,第一个公开版本 0.1.0 发布于 2004 年 10 月 4 日。其将源代
      码以类 BSD 许可证的形式发布,因它的稳定性、丰富的功能集、示例配置文件和低系统
      资源的消耗而闻名。
    62. Java Web 开发的 Model 1 和 Model 2 分别指的是什么?
      答:Model 1 是以页面为中心的 Java Web 开发,只适合非常小型的应用程序,Model 2
      是基于 MVC 架构模式的应用,这一点在前文的面试题中已经详细讲解过了。
    63. 说说什么是框架:
      框架(framework)是一个框子--》指约束性,也是一个架子--》指支撑性 IT 语境中
      的框架,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,在此结构上
      可以根据具体问题扩展、按插更多的组成部分,从而更迅速和方便地架构完整的解决问
      题的方案。
      1)框架本身一般不完整到可以解决特定问题,但是可以帮助您快速解决特定问题:
      没有框架所有的工作都从零开始做,有了框架,为我们提供了一定的功能。我们就
      可以在框架的基础上开发,极大的解决了生产力。
      不同的框架,是为了解决不同领域的问题,一定要为了解决问题才去学习框架。
      2)框架天生就是为了扩展而设计的
      3)框架里面可以为后续的组件提供很多辅助性、支撑性的方便易用的实用工具
      (utilities),也就是框架时常配套一些帮组解决某类问题的库(libraries)或工具(tools). 在 java 中就是一系列的 jar 包,其本质就是对 jdk 功能的扩展。
    64. 简单说一下 MVC 框架?
      是为了解决传统 MVC 模式(jsp+servlet+javabean)一些问题而出现的框架
      传统 MVC 模式模式问题:
      1)所有的 Servlet 和 Servlet 映射都要配置在 web.xml 中,如果项目太大,web.xml
      就太庞大并且不能实现模块化管理。
      2)Servlet 的主要功能就是接受参数、调用逻辑、跳转页面,比如像其他字符编码、
      文件上传等功能也要写在 Servlet 中,不能让 Servlet 主要功能而需要做处理一些特例。
      3)接受参数比较麻烦
      (String name = request.getParameter(“name”)),不能通过 model 接受,只
      能单个接收,接收完成后转换封装 model。 4)跳转页面方式比较单一(forward,redirect),并且当我们的页面名称发生改变时
      需要改变 Servlet 源代码。
      现在比较常用的 MVC 框架:
      webwork
      Struts
      Struts2
      SpringMVC
    65. 简单讲一下 struts2 的执行流程
      一个请求在 struts2 框架中处理大概分为一下几个步骤:
      1)客户浏览器发送一个指向 Servlet 容器(例如 Tomcat)的请求
      2)这个请求经过一系列的过滤器(Filter)(这些过滤器中有一个叫做
      ActionContextCleanUp 的可选过滤器,这个过滤器对于 Struts2 和其他框架的集成很
      有帮助,例如:SiteMesh Plugin) 3)接着 FilterDispatcher(StrutsPrepareAndExecuteFilter)被调用,
      FilterDispatcher 询问 ActionMapper 来决定这个请是否需要调用某个 Action
      4)如果 ActionMapper 决定需要调用某个 Action,FilterDispatcher 把请求的处
      理交给 ActionProxy
      5)ActionProxy 通过 Configuration Manager 询问框架的配置文件,找到需要调
      用的 Action 类 6)ActionProxy 创建一个 ActionInvocation 的实例。
      7)ActionInvocation 实例使用命名模式来调用,在调用 Action 的过程前后,涉及
      到相关拦截器(Intercepter)的调用。
      8)一旦 Action 执行完毕,ActionInvocation 负责根据 struts.xml 中的配置找到对
      应的返回结果。返回结果通常是(但不总是,也 可 能是另外的一个 Action 链)一个需
      要被表示的 JSP 或者 FreeMarker 的模版。在表示的过程中可以使用 Struts2 框架中继
      承的标签。在这个过程中需要涉及到 ActionMapper
    66. Struts2 中的拦截器,你都用它干什么?
      java 里的拦截器是动态拦截 Action 调用的对象,它提供了一种机制可以使开发者定
      义一个 action 执行的前后执行的代码,也可以在一个 action 执行前阻止其执行,同时
      也提供了一种可以提取 action 中可重用部分的方式。
      在 AOP(Aspect Oriented Programming)中拦截器用于在某个方法或字段被访问
      之前,进行拦截后在之前或之后加入某些操作
      1)struts2 中的功能(参数处理、文件上传、字符编码等)都是通过系统拦截器实现
      的,
      2)当然我们也可以自定义拦截器,进行可插拔配置,可以执行 Action 的方法前后,
      加入相关逻辑完成业务。
      使用场景:
      1)用户登录判断,在执行 action 的前面判断是否已经登录,如果没有登录的就跳
      转登录页面。 2)用户权限判断,在执行 action 的前面判断是否具有,如果没有权限就给出提示
      信息。
      3)操作日志...
    67. 简单讲一下 SpringMVC 的执行流程?
      1)用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet
      捕获;
      2)DispatcherServlet 对请求 URL 进行解析,得到请求资源标识符(URI)。然后
      根据该 URI,调用 HandlerMapping 获得该 Handler 配置的所有相关的对象 (包括
      Handler 对象以及 Handler 对象对应的拦截器),最后以 HandlerExecutionChain 对象
      的形式返回;
      3)DispatcherServlet 根据获得的 Handler,选择一个合适的 HandlerAdapter。
      (附注:如果成功获得 HandlerAdapter 后,此时将开始执行拦截器的 preHandler(...)
      方法)
      4) 提取 Request 中的模型数据,填充 Handler 入参,开始执行 Handler
      (Controller)。 在填充 Handler 的入参过程中,根据你的配置,Spring 将帮你做一些
      额外的工作:
      HttpMessageConveter: 将请求消息(如 Json、xml 等数据)转换成一个对象,
      将对象转换为指定的响应信息
      数据转换:对请求消息进行数据转换。如 String 转换成 Integer、Double 等
      数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化
      日期等
      数据验证: 验证数据的有效性(长度、格式等),验证结果存储到 BindingResult
      或 Error 中 5)Handler 执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
      6)根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册
      到 Spring 容器中的 ViewResolver)返回给 DispatcherServlet ; 7)ViewResolver 结合 Model 和 View,来渲染视图
      8)将渲染结果返回给客户端。
      快速记忆:
      核心控制器捕获请求,查找 Hander,执行 Handler,选择 ViewResolver,通过
      ViewResoler 渲染视图并返回
    68. 简单说一下 struts2 和 springMVC 有什么不同
      目前企业中使用 SpringMvc 的比例已经远远超过 Struts2,那么两者到底有什么区别,
      是很多初学者比较关注的问题,下面我们就来对 SpringMvc 和 Struts2 进行各方面的比
      较: 1)核心控制器(前端控制器、预处理控制器):对于使用过 mvc 框架的人来说这个
      词应该不会陌生,核心控制器的主要用途是处理所有的请求,然后对那些特殊的请求(控
      制器)统一的进行处理(字符编码、文件上传、参数接受、异常处理等等),spring mvc 核
      心控制器是 Servlet,而 Struts2 是 Filter。 2)控制器实例:Spring Mvc 会比 Struts 快一些(理论上)。Spring Mvc 是基于方
      法设计,而 Sturts 是基于对象,每次发一次请求都会实例一个 action,每个 action 都
      会被注入 属性,而 Spring 更像 Servlet 一样,只有一个实例,每次请求执行对应的方
      法即可(注意:由于是单例实例,所以应当避免全局变量的修改,这样会产生线程安全问
      题 ) 3)管理方式:大部分的公司的核心架构中,就会使用到 spring,而 spring mvc 又
      是 spring 中的一个模块,所以 spring 对于 spring mvc 的控制器管理更加简单方便,
      而且提供了全 注解方式进行管理,各种功能的注解都比较全面,使用简单,而 struts2
      需要采用 XML 很多的配置参数来管理(虽然也可以采用注解,但是几乎没有公司那 样
      使用)
      4)参数传递:Struts2 中自身提供多种参数接受,其实都是通过(ValueStack)进
      行传递和赋值,而 SpringMvc 是通过方法的参数进行接收。
      5)学习难度:Struts 更加很多新的技术点,比如拦截器、值栈及 OGNL 表达式,
      学习成本较高,springmvc 比较简单,很较少的时间都能上手。
      6)intercepter 的实现机制:struts 有以自己的 interceptor 机制,spring mvc 用
      的是独立的 AOP 方式。这样导致 struts 的配置文件量还是比 spring mvc 大,虽然 struts
      的配置能继承,所以我觉得论使用上来讲,spring mvc 使用更加简洁,开发效率 Spring
      MVC 确实比 struts2 高。spring mvc 是方法级别的拦截,一个方法对应一个 request
      上下文,而方法同时又跟一个 url 对应,所以说从架构本身上 spring3 mvc 就容易实现
      restful url。struts2 是类级别的拦截,一个类对应一个 request 上下文;实现 restful url
      要费劲,因为 struts2 action 的一个方法可以对应一个 url;而其类属性却被所有方法共
      享,这也就无法用注解或其他方式标识其所属方法了。spring3 mvc 的方法之间基本上
      独立的,独享 request response 数据,请求数据通过参数获取,处理结果通过
      ModelMap 交回给框架方法之间不共享变量,而 struts2 搞的就比较乱,虽然方法之间
      也是独立的,但其所有 Action 变量是共享的,这不会影响程序运行,却给我们编码,读
      程序时带来麻烦。 7)spring mvc 处理 ajax 请求,直接通过返回数据,方法中使用注解
      @ResponseBody,spring mvc 自动帮我们对象转换为 JSON 数据。而 struts2 是通过
      插件的方式来处理。
      在springMVC流行起来之前,struts2在MVC框架中占核心地位,随着SpringMVC
      的出现,SpringMVC 慢慢的取代了 struts2,但是很多的企业原来搭建的框架都是使用
      struts2。
    69. 说一下 Spring 中的两大核心
      Spring 是什么?
      Spring 是 J2EE 应用程序框架,是轻量级的 IOC 和 AOP 的容器框架,主要针对
      JavaBean 的生命周期进行管理的轻量级容器,可以单独使用,也可以和 struts 框架,
      ibatis 框架等组合使用。
      1)IOC(Inversion of Control)
      ioc 控制反转,又称为“依赖注入”;
      IOC 的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对
      象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器负责将这些
      联系在一起。
      其原理是基于 OO 设计原则的 The Hollywood Principle:Don't call us, we'll
      call you(别找我,我会来找你的)。也就是说,所有的组件都是被动的(Passive),
      所有的组件初始化和调用都由容器负责。组件处在一个容器当中,由容 器负责管理。
      简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码
      直接操控。这也就是所谓“控制反转”的概念所在:控制权由应用代码中转到了外
      部容器,控制权的转移,是所谓反转。
      2)AOP 面向切面编程
      核心原理:使用动态代理的设计模式在执行方法前后或出现异常常做加入相关逻辑
      我们使用 AOP 来做:
      1)事务处理:执行方法前开启事务,执行完成后关闭事务,出现异常后回滚事务
      2)权限判断:在执行方法前,判断是否具有权限
      3)日志:在执行前进行日志处理
    70. 讲一下 Spring 的事务的传播特性
      多个事物存在是怎么处理的策略
      1)PROPAGATION_REQUIRED:如果存在一个事务,则支持当前事务,如果当前
      没有事务,就新建一个事务。这是最常见的选择。
      2)PROPAGATION_SUPPORTS:如果存在一个事务,支持当前事务,如果当前没
      有事务,就以非事务方式执行。
      3)PROPAGATION_MANDATORY:如果存在一个事务,支持当前事务,如果当前
      没有事务,就抛出异常。
      4)PROPAGATION_REQUIRES_NEW:新建事务,如果当前存在事务,把当前事
      务挂起。
      5)PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事
      务,就把当前事务挂起。
      6)PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
      7)PROPAGATION_NESTED:支持当前事务,新增 Savepoint 点,与当前事务同
      步提交或回滚。
    71. 什么是 ORM
      对象关系映射(Object Relation Mapping,简称 ORM)模式是一种为了解决面向对
      象与关系数据库存在的互不匹配的现象的技术,简单的说,ORM 是通过使用描述对象和
      数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中,那么到底如何
      实现持久化呢?一种简单的方案时采用硬编码方式(jdbc 操作 sql 方式),为每一种可能
      的数据库访问操作提供单独的方法。
      这种方案存在以下不足:
    72. 持久化层缺乏弹性,一旦出现业务需求变更,就必须修改持久化层的接口
    73. 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型
      发生变化,都要修改持久化层的相关程序代码,增加软件的维护难度。
      ORM 提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,
      使得 ORM 中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁,Java 典型
      的 ORM 框架有:Hibernate,ibatis(mybtis),speedframework。
      ORM 框架的方法论基于三个核心原则:
      简单:以最基本的形式建模数据
      传达性:数据库结构被任何人都能理解的语言文档化
      精确性:基于数据模型创建正确标准化了结构
      对象关系映射(Object Relation Mapping,简称 ORM)模式是一种为了解决面向对
      象与关系数据库存在的互不匹配的现象的技术,可以简单的方案采用硬编码方式(jdbc
      操作 sql 方式),为每一种可能的数据库访问操作提供单独的方法,这种方法存在很多缺
      陷,使用 ORM 框架(为了解决面向对象与关系数据库存在互不匹配的现象的框架)来解决。
      尚学堂 Java 面试题大全及参考答案
    74. Hibernate 对象的状态
      临时状态/瞬时状态(transient):刚刚用 new 语句创建,没有被持久化,无 id
      不处于 session 中(没有使用 session 的方法去操作临时对象),该对象成为临时对象
      持久化状态,托管状态(persistent):已经被持久化,加入 session 的缓存中,session
      是没有关闭
      该状态的对象为持久化对象。
      游离状态,脱管状态(detached):已经被持久化,但不处于 session 中,该状态的
      对象为游离对象。
      删除状态(removed):对象有关联的 id,并且在 session 管理下,但是已经被计划(事
      务提交的时候,commit)删除,如果没有事务就不能删除
      相互转换
    75. 介绍一下 Hibernate 的缓存
      答:
      一、why(为什么要用 Hibernate 缓存?)
      Hibernate 是一种持久化层框架,经常访问物理数据库。
      为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能
      缓存内的数据是对物理数据源中的数据的复制,应用程序在运行时从缓存读写数据,
      在特定的时刻或事件会同步缓存和物理数据源的数据。
      为了提高访问速度,把磁盘或者数据库访问变成内存访问
      二、what(Hibernate 缓存原理是怎样的?)Hibernate 缓存包括两大类:Hibernate
      一级缓存和 Hibernate 二级缓存
    76. Hibernate 一级缓存又称为”session 的缓存”。
      session 缓存内置不能被卸载,session 的缓存是事务范围的缓存(session 对象的生
      命周期通常对应一个数据库事务或者一个应用事务)。
      一级缓存中,持久化类的每个实例都具有唯一的 OID
    77. Hibernate 的二级缓存又称为”sessionFactory 的缓存”。
      由于 sessionFactory 对象的生命周期和应用程序的整个过程对应,因此 Hibernate
      二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的
      并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
      第二级缓存是可选的,是一个可配置的插件,默认下 sessionFactory 不会启用这个
      插件。
      什么样的数据适合存放到二级缓存中?
    1. 很少被修改的数据 (帖子的最后回复时间)
    2. 经常被查询的数据 (电商的地点)
    3. 不是很重要的数据,允许出现偶尔并发的数据
    4. 不会被并发访问的数据
    5. 常量数据
      扩展:Hibernate 的二级缓存默认是不支持分布式缓存的,使用 memcache,redis
      等中央缓存来代替二级缓存。
    1. 简单讲一下 webservice 使用的场景
      webservice 是一个 SOA(面向服务的编程)的架构,它是不依赖于语言,不依赖于平
      台,可以实现不同的语言间的相互调用,通过 Internet 进行基于 http 协议的网络应用
      间的交互。
      1、异构系统(不同的开发语言)的整合
      2、不同客户端的整合 (浏览器、手机端(androidios)、微信) 3、实实在在的例子:
      天气预报:可以通过实现 webservice 客户端调用远程天气服务实现的
      4、单点登录:一个服务实现所有系统的登录
    2. 简单介绍一下 activity?
      Activity 是一个业务流程管理(BPM)和工作流系统,适用于开发人员和系统管理员,
      其核心是超快速,稳定的 BPMN2 的流程引擎,它易于与 Spring 集成使用。
      主要用在 OA 中,把线下流程放在线上,把现实生活中一些流程固话定义到系统中,
      然后通过输入表单数据完成业务。
      他可以用在 OA 系统的流程管理中
      请假流程(小于三天,一级主管审批,大于三天二级主管审批)
      报销流程(价格区间)
    3. 什么是 MyBatis?
      答:MyBatis 是一个可以自定义 SQL、存储过程和高级映射的持久层框架。
    4. Mybatis 是如何进行分页的?分页插件的原理是什么?
      答:
      1)Mybatis 使用 RowBounds 对象进行分页,也可以直接编写 sql 实现分页,也可
      以使用 Mybatis 的分页插件。
      2)分页插件的原理:实现 Mybatis 提供的接口,实现自定义插件,在插件的拦截
      方法内拦截待执行的 sql,然后重写 sql。
      举例:select * from student,拦截 sql 后重写为:select t.* from (select * from
      student)t limit 0,10
    5. MyBatis 与 Hibernate 有哪些不同?
      答:
      1)Mybatis 和 hibernate 不同,它不完全是一个 ORM 框架,因为 MyBatis 需要
      程序员自己编写 Sql 语句,不过 mybatis 可以通过 XML 或注解方式灵活配置要运行的
      sql 语句,并将 java 对象和 sql 语句映射生成最终执行的 sql,最后将 sql 执行的结果再
      映射生成 java 对象。
      2)Mybatis 学习门槛低,简单易学,程序员直接编写原生态 sql,可严格控制 sql
      执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、
      企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但
      是灵活的前提是 mybatis 无法做到数据库无关性,如果需要实现支持多种数据库的软件
      则需要自定义多套 sql 映射文件,工作量大。
      3)Hibernate 对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软
      件(例如需求固定的定制化软件)如果用 hibernate 开发可以节省很多代码,提高效率。
      但是 Hibernate 的缺点是学习门槛高,要精通门槛更高,而且怎么设计 O/R 映射,在性
      能和对象模型之间如何权衡,以及怎样用好 Hibernate 需要具有很强的经验和能力才行。
      总之,按照用户的需求在有限的资源环境下只要能做出维护性、扩展性良好的软件
      架构都是好架构,所以框架只有适合才是最好。
    6. 简述 Mybatis 的 Xml 映射文件和 Mybatis 内部数据结构之间的映射关
      系?
      答:Mybatis将所有Xml配置信息都封装到All-In-One重量级对象Configuration
      内部。在 Xml 映射文件中,标签会被解析为 ParameterMap 对象,
      其每个子元素会被解析为 ParameterMapping 对象。标签会被解析为
      ResultMap 对象,其每个子元素会被解析为 ResultMapping 对象。每一个