史上最全的Spring面试题汇总

一、Spring概述基础

1、Spring是什么?有什么特点?

(1)Spring是一个轻量级Java开发框架,最早有Rod Johnson创建。
(2)Spring设计目标:Spring为开发者提供一个一站式轻量级应用开发平台;
(3)Spring设计理念:在JavaEE开发中,支持POJO和JavaBean开发方式,使应用面向接口开发,充分支持OO(面向对象)设计方法;Spring通过IoC容器实现对象耦合关系的管理,并实现依赖反转,将对象之间的依赖关系交给IoC容器,实现解耦;
(4)Spring框架的核心:IoC容器和AOP模块。通过IoC容器管理POJO对象以及他们之间的耦合关系;通过AOP以动态非侵入的方式增强服务。

优点:
(1)方便解耦,简化开发:Spring就是一个大工厂,可以将所有对象的创建和依赖关系的维护,交给Spring管理。
(2)AOP编程的支持:Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能。
(3)声明式事务的支持:只需要通过配置就可以完成对事务的管理,而无需手动编程。
(4)方便程序的测试:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
(5)方便集成各种优秀框架:Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架的直接支持(如:Struts、Hibernate、MyBatis等)。
(6)降低JavaEE API的使用难度:Spring对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),都提供了封装,使这些API应用难度大大降低。
缺点:
(1)Spring明明一个很轻量级的框架,却给人感觉大而全
(2)Spring依赖反射,反射影响性能
(3)使用门槛升高,入门Spring需要较长时间

应用场景就是两个核心框架:SSH和SSM。
1.Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的开源容器框架,它由Rod Johnson(音乐学博士)创建。
2. Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。

2、Spring由哪些模块组成?

Spring 总共大约有 20 个模块, 由 1300 多个不同的文件构成。 而这些组件被分别整合在核心容器(Core Container) 、 AOP(Aspect Oriented Programming)和设备支持(Instrmentation) 、数据访问与集成(Data Access/Integeration) 、 Web、 消息(Messaging) 、 Test等 6 个模块中:
史上最全的Spring面试题汇总_第1张图片

1.核心容器(Core Container)

  • Spring-core模块:提供了框架的基本组成部分,包括控制反转(IOC)和依赖注入(DI)功能。
  • Spring-beans模块:提供了BeanFactory与Bean的装配,使Spring成为一个容器。
  • Spring-context模块:应用上下文,建立在1和2基础之上,提供一个框架式的对象访问方式,是访问定义和配置任何对象的媒介,使Spring成为一个框架。
  • Spring-context-support模块:支持整合第三方库到Spring应用程序上下文,特别是用于高速缓存(EhCache、JCache)和任务调度(CommonJ、Quartz)的支持。
  • Spring-expression模块:提供了强大的表达式语言(扩展的EL)去支持运行时查询和操作对象图。

2. 中间层

  • Spring-aop模块:提供了一个符合AOP要求的面向切面的编程实现,允许定义方法拦截器和切入点,将代码按照功能进行分离,以便干净地解耦。
  • Spring-aspects模块:提供了与AspectJ的集成功能,AspectJ是一个功能强大且成熟的AOP框架。
  • Spring-instrument模块:提供了类植入(Instrumentation)支持和类加载器的实现,可以在特定的应用服务器中使用。
  • Spring-messaging模块:提供了对消息传递体系结构和协议的支持。

3. 数据持久层(Data Access/Integration)

  • Spring-jdbc模块:提供了一个JDBC的抽象层,消除了烦琐的JDBC编码和数据库厂商特有的错误代码解析。
  • Spring-orm模块:提供一个对象关系映射(Object-Relational Mapping)API框架,包括JPA和Hibernate。
  • Spring-oxm模块:提供了一个支持对象/XML映射的抽象层实现,例如JAXB、Castor、JiBX和XStream。
  • Spring-jms模块:指Java消息传递服务,包含用于生产和使用消息的功能。
  • Spring-tx模块:支持用于实现特殊接口和所有POJO类的编程和声明式事务管理。

4. Web层

  • Spring-web模块:提供了基本的Web开发功能,例如多文件上传功能、使用Servlet监听器初始化一个IOC容器以及Web应用上下文。
  • Spring-webmvc模块:提供了Web应用程序的Spring MVC和REST Web Services实现。
  • Spring-websocket模块:提供了WebSocket和SocketJS的实现。
  • Portlet模块:类似于Servlet模块的功能,提供了Portlet环境下的MVC实现。

5. 测试

  • Spring-test模块支持使用JUnit或TestNG对Spring组件进行单元测试和集成测试。

二、事务概述

1. 事务(Transaction)的概念

  1. 什么是事务:事务是逻辑上的一组操作,要么都执行,要么都不执行。

  2. 事务的特性(ACID)

       1. 原子性(Atomicity):事务是最小的执行单元,要么都执行,要么都不执行。
    
       2. 一致性(Consistency):事务执行前后,数据保持一致;
    
       3. 隔离性(Isolation):并发访问数据库时,一个用户的事物不被其他事物所干扰
          多个并发事务之间数据库是独立的。
    
       5. 持久性(Durability): 当事务提交后,它对数据的改变是永久的
       	  即使数据库发生故障也不应该对其有任何影响。
    
  3. 事务并发导致的问题

    	   1. 第一类丢失更新(回滚丢失):撤销一个事务时,把其他事务已提交的更新数据覆盖。
    
           2. 脏读:在一个事务处理过程里读取了另一个未提交的事务中的数据。
    
           3. 不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果
              中间正好另一个事务更新了该数据,两次结果相异,不可被信任。
    
           4. 幻读(虚读):一个事务执行两次查询,第二次结果集包含第一次中没有或
              某些行已经被删除的数据,造成两次结果不一致。
    
           5. 第二类丢失更新(覆盖丢失):如果两个事物都读取同一行
              然后两个都进行写操作并提交,第一个事物所做的改变就会丢失。
    
    1. 事务的隔离级别
      史上最全的Spring面试题汇总_第2张图片

什么是IOC,什么是DI,他们有什么区别?

依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个 数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖

应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转。

什么是IoC,为什么使用IoC ?

IoC全称Iversion of Controller,控制反转。
当某个角色需要另外一个角色协助的时候,在传统的程序设计过程中,通常由调用者来创建被调用者的实例对象。但在spring中创建被调用者的工作不再由调用者来完成,因此称为控制反转。创建被调用者的工作由spring来完成,然后注入调用者 直接使用。

它能指导我们如何设计出松耦合、更优良的程序。

什么是AOP,为什么使用AOP ?

AOP全称:Aspect-Oriented Programming,面向切面编程。
AOP,面向切面编程,就是把可重用的功能提取出来,然后将这些通用功能在合适的时候织入到应用程序中,比如事务管理、权限控制、日志记录、性能统计等。
AOP并没有帮助我们解决任何新的问题,它只是提供了一种更好的办法,能够用更少的工作量来解决现有的一些问题,使得系统更加健壮,可维护性更好。

Spring MVC的请求流程?

第一步:发起请求到前端控制器(DispatcherServlet)
第二步:前端控制器请求HandlerMapping查找Handler可以根据xml配置、注解进行查找
第三步:处理器映射器HandlerMapping向前端控制器返回Handler
第四步:前端控制器调用处理器适配器去执行Handler
第五步:处理器适配器去执行Handler
第六步:Handler执行完成给适配器返回ModelAndView
第七步:处理器适配器向前端控制器返回ModelAndView。ModelAndView是springmvc框架的一个底层对象,包括 Model和view
第八步:前端控制器请求视图解析器去进行视图解析,根据逻辑视图名解析成真正的视图(jsp)
第九步:视图解析器向前端控制器返回View
第十步:前端控制器进行视图渲染。视图渲染将模型数据(在ModelAndView对象中)填充到request域
第十一步:前端控制器向用户响应结果

Springmvc的优点?

1.它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是 java组件.并且和Spring提供的其他基础结构紧密集成.

2.不依赖于Servlet API(目标虽是如此,但是在实现的时候确实是依赖于Servlet的)

可以任意使用各种视图技术,而不仅仅局限于JSP
4 . 支持各种请求资源的映射策略

5 .它应是易于扩展的

Spring MVC 和 Struts2 对比?

1). Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上SpringMVC 就容易实现restful url
2). 由上边原因,SpringMVC的方法之间基本上独立的,独享request response数据,请求数据通过参数获取,处理结果通过ModelMap交回给框架,方法之间不共享变量,而Struts2搞的就比较乱,虽然方法之间也是独立的,但其所有Action变量是共享的,这不会影响程序运行,却给我们编码 读程序时带来麻烦,每次来了请求就创建一个Action,一个Action对象对应一个request上下文。
3). 由于Struts2需要针对每个request进行封装,把request,session等servlet生命周期的变量封装成一个一个Map,供给每个Action使用,并保证线程安全,所以在原则上,是比较耗费内存的。
4). SpringMVC集成了Ajax,使用非常方便,只需一个注解@ResponseBody就可以实现,然后直接返回响应文本即可,而Struts2拦截器集成了Ajax,在Action中处理时一般必须安装插件或者自己写代码集成进去,使用起来也相对不方便。
5). springmvc面向方法开发的(更接近service接口的开发方式),struts2面向类开发。
6). springmvc可以单例开发,struts2只能是多例开发。

你可能感兴趣的:(JAVA,spring,spring,面试,java)