作为一名高级Java工程师,不仅要具备扎实的理论功底,还要有较多的项目经验,要对市面上的主流技术有一个大致的了解。框架能够提升程序开发效率,也是高薪Java工程师面试必问的技术,今天猎萝卜小编就给大家分享一下常见的Spring框架面试题。


1、什么是Spring?


  Spring是个Java企业级应用的开源开发框架。Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的web应用。Spring框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。


2、选择使用Spring框架的原因?


  使用Spring: 第一是使用它的IOC功能,在解耦上达到了配置级别。 第二是使用它对数据库访问事务相关的封装。 第三就是各种其他组件与Spring的融合,在Spring中更加方便快捷的继承其他一些组件。


3、Spring 是如何管理事务的?


  spring的事务声明有两种方式,编程式和声明式。spring主要是通过“声明式事务”的方式对事务进行管理,即在配置文件中进行声明,通过AOP将事务切面切入程序,最大的好处是大大减少了代码量。


image.png


4、Spring IoC容器配置Bean的方式?


  1)基于XML文件进行配置。


  2)基于注解进行配置。


  3)基于Java程序进行配置(Spring 3+)


5、Spring框架有哪些不同的模块?


  核心容器模块、应用上下文模块Application context、AOP模块、JDBC抽象和DAO模块、O/R映射整合模块、Web模块、MVC框架模块。


6、一个简单的Spring应用程序包括什么?


  这些应用程序像任何Java应用程序。它们是由多个类组成,每个类执行应用程序内的一个特定的功能。这些类的配置是通过一个XML文件向对方导入依赖。此XML文件描述如何配置类,称为Spring配置文件。


7、如何给Spring容器提供配置元数据?


  有三种重要的方法给Spring 容器提供配置元数据:XML配置文件、基于注解的配置、基于Java的配置。


8、在Spring中如何注入一个Java集合?


  Spring提供以下几种集合的配置元素:


  1)<list>类型用于注入一列值,允许有相同的值。


  2)<set> 类型用于注入一组值,不允许有相同的值。


  3)<map> 类型用于注入一组键值对,键和值都可以为任意类型。


  4)<props>类型用于注入一组键值对,键和值都只能为String类型。


9、在Spring框架中如何更有效地使用JDBC?


  使用Spring JDBC框架,资源管理和错误处理的代价都会被减轻。所以开发者只需statements和queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JDBC Template 。


10、Bean 是如何被管理的?


  在Spring框架中,一旦把一个bean纳入到Spring IoC容器之中,这个bean的生命周期就会交由容器进行管理,一般担当管理者角色的是BeanFactory或ApplicationContext。认识一下Bean的生命周期活动,对更好的利用它有很大的帮助。


  概括来说主要有四个阶段:实例化,初始化,使用,销毁。


11、Spring中的自动装配有哪些限制?


  1)如果使用了构造器注入或者setter注入,那么将覆盖自动装配的依赖关系。


  2)基本数据类型的值、字符串字面量、类字面量无法使用自动装配来注入。


  3)优先考虑使用显式的装配来进行更精确的依赖注入而不是使用自动装配。


12、Resource 是如何被查找、加载的?


  Resource 接口是 Spring 资源访问策略的抽象,它本身并不提供任何资源访问实现,具体的资源访问由该接口的实现类完成——每个实现类代表一种资源访问策略。Spring 为 Resource 接口提供了如下实现类:


  1)UrlResource:访问网络资源的实现类。


  2)ClassPathResource:访问类加载路径里资源的实现类。


  3)FileSystemResource:访问文件系统里资源的实现类。


  4)ServletContextResource:访问相对于 ServletContext 路径里的资源的实现类:


  5)InputStreamResource:访问输入流资源的实现类。


  6)ByteArrayResource:访问字节数组资源的实现类。 这些 Resource 实现类,针对不同的的底层资源,提供了相应的资源访问逻辑,并提供便捷的包装,以利于客户端程序的资源访问。


13、有哪些常用的 Context?


  最常被使用的 ApplicationContext 接口实现:


  1)FileSystemXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你需要提供给构造器 XML 文件的完整路径。


  2)ClassPathXmlApplicationContext:该容器从 XML 文件中加载已被定义的 bean。在这里,你不需要提供 XML 文件的完整路径,只需正确配置 CLASSPATH 环境变量即可,因为,容器会从 CLASSPATH 中搜索 bean 配置文件。


  3)WebXmlApplicationContext:该容器会在一个 web 应用程序的范围内加载在 XML 文件中已被定义的 bean。


14、Spring中Bean的作用域有哪些?


  1)singleton作用域


  在默认情况下,spring的ApplicationContext容器在启动时,自动实例化所有singleton的Bean并缓存于容器中.虽然启动时会花费一些时间,但带来两个好处:首先对Bean提前的实例化操作会及早发现一些潜在的配置问题.其次Bean以缓存的方式保存,当运行时使用到该Bean时就无须再实例化了,加快了运行效率.如果用户不希望在容器启动时提前实例化singleton的Bean,可以通过lazy-init属性进行控制.


  2)prototype作用域


  在默认情况下,spring容器在启动时不实例化prototype的Bean.此外,spring容器将prototype的Bean交给调用者后,就不再管理它的生命周期.


  3)request作用域


  每次HTTP请求都会创建一个新的Bean,HTTP请求处理完毕后,销毁这个Bean.该作用域仅适用于webApplicationContext环境.


  4)session作用域


  同一个HTTP session共享一个Bean,不同HTTP session使用不同的Bean,当HTTP Session结束后,实例才被销毁.该作用域仅适用于webApplicationContext环境


  5)globalSession作用域


  同一个全局session共享一个Bean,一般用于portlet应用环境,该作用域仅适用于webApplicationContext环境.


15、什么是IoC和DI?DI是如何实现的?


  1)IOC


  IOC是Inversion of Control的缩写,“控制反转”之意。 软件系统在没有引入IOC容器之前,对象A依赖于对象B,那么对象A在初始化或者运行到某一点的时候,自己必须主动去创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。 软件系统在引入IOC容器之后,这种情形就完全改变了,由于IOC容器的加入,对象A与对象B之间失去了直接联系,所以,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。 通过前后的对比,我们不难看出来:对象A获得依赖对象B的过程,由主动行为变为了被动行为,控制权颠倒过来了,这就是“控制反转”这个名称的由来。


  2)DI


  2004年,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”,经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。 依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。


  3)优点


  降低类之间耦合,可维护性比较好,非常便于进行单元测试,便于调试程序和诊断故障。 模块之间通过接口交流,互不干扰,便于团队开发。 可复用性好 模块具有热插拔特性,可直接修改配置文件。


  4)缺点


  引入了第三方IOC容器,生成对象的步骤变得有些复杂 IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。 额外的配置工作。


16、如何通过HibernateDaoSupport将Spring和Hibernate结合起来?


  用Spring的SessionFactory调用LocalSessionFactory。集成过程分三步:


  配置the Hibernate Session Factory、继承HibernateDaoSupport实现一个DAO、在AOP支持的事务中装配。


17、解释一下Spring MVC框架及其控制器


  Spring配备构建Web应用的全功能MVC框架。Spring可以很便捷地和其他MVC框架集成,如Struts、Spring的MVC框架用控制反转把业务对象和控制逻辑清晰地隔离。它也允许以声明的方式把请求参数和业务对象绑定。


  控制器提供一个访问应用程序的行为,此行为通常通过服务接口实现。控制器解析用户输入并将其转换为一个由视图呈现给用户的模型。Spring用一个非常抽象的方式实现了一个控制层,允许用户创建多种用途的控制器。


18、Spring MVC的工作原理是怎样的?


  Spring MVC的工作原理如所示:


  1)客户端的所有请求都交给前端控制器DispatcherServlet来处理,它会负责调用系统的其他模块来真正处理用户的请求。


  2)DispatcherServlet收到请求后,将根据请求的信息(包括URL、HTTP协议方法、请求头、请求参数、Cookie等)以及HandlerMapping的配置找到处理该请求的Handler(任何一个对象都可以作为请求的Handler)。


  3)在这个地方Spring会通过HandlerAdapter对该处理器进行封装。


  4)HandlerAdapter是一个适配器,它用统一的接口对各种Handler中的方法进行调用。


  5)Handler完成对用户请求的处理后,会返回一个ModelAndView对象给DispatcherServlet,ModelAndView顾名思义,包含了数据模型以及相应的视图的信息。


  6)ModelAndView的视图是逻辑视图,DispatcherServlet还要借助ViewResolver完成从逻辑视图到真实视图对象的解析工作。


  7)当得到真正的视图对象后,DispatcherServlet会利用视图对象对模型数据进行渲染。


  8)客户端得到响应,可能是一个普通的HTML页面,也可以是XML或JSON字符串,还可以是一张图片或者一个PDF文件。


19、什么是Spring的内部bean?


  当一个bean仅被用作另一个bean的属性时,它能被声明为一个内部bean,为了定义inner bean,在Spring 的 基于XML的 配置元数据中,可以在或元素内使用 元素,内部bean通常是匿名的,它们的Scope一般是prototype。


20、在Spring框架中如何更有效地使用JDBC?


  使用SpringJDBC 框架,资源管理和错误处理的代价都会被减轻。所以开发者只需写statements 和 queries从数据存取数据,JDBC也可以在Spring框架提供的模板类的帮助下更有效地被使用,这个模板叫JdbcTemplate (例子见这里here)


  1)JdbcTemplate


  JdbcTemplate 类提供了很多便利的方法解决诸如把数据库数据转变成基本数据类型或对象,执行写好的或可调用的数据库操作语句,提供自定义的数据错误处理。


  2)Spring对DAO的支持


  Spring对数据访问对象(DAO)的支持旨在简化它和数据访问技术如JDBC,Hibernate or JDO 结合使用。这使我们可以方便切换持久层。编码时也不用担心会捕获每种技术特有的异常。


  当然,以上只是部分高级Java工程师面试会遇到的问题,如果你想成为企业高薪竞聘的人才,一定要与时俱进更新知识体系!