Java工程师面试集锦之Spring框架


Posted in 面试题 onJune 16, 2013

  作为一名高级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将事务切面切入程序,最大的好处是大大减少了代码量。

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工程师面试会遇到的问题,如果你想成为企业高薪竞聘的人才,一定要与时俱进更新知识体系!


Tags in this post...

面试题 相关文章推荐
Weblogc domain问题
Jan 27 面试题
得到Class的三个过程是什么
Aug 10 面试题
什么是典型的软件三层结构?软件设计为什么要分层?软件分层有什么好处?
Mar 14 面试题
益模软件Java笔试题
Mar 27 面试题
面向对象编程是如何提高软件开发水平的
May 06 面试题
什么情况下你必须要把一个类定义为abstract的
Jan 06 面试题
C#的几个面试问题
May 22 面试题
写一个函数,要求输入一个字符串和一个字符长度,对该字符串进行分隔
Jul 30 面试题
灵泰克Java笔试题
Jan 09 面试题
北京振戎融通Java面试题
Sep 03 面试题
UNIX文件类型
Aug 29 面试题
J2EE的优越性主要表现在哪些方面
Mar 28 面试题
2019年Java 最常见的 面试题
Oct 19 #面试题
2019年Java面试必问之经典试题
Sep 12 #面试题
金讯Java笔试题目
Jun 18 #面试题
某公司Java工程师面试题笔试题
Mar 27 #面试题
JAVA代码查错题
Oct 10 #面试题
怎么处理XML的中文问题
Mar 26 #面试题
一套Java笔试题
Aug 20 #面试题
You might like
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
Nigma vs Liquid BO3 第一场2.13
2021/03/10 DOTA
javascript同步Import,同步调用外部js的方法
2008/07/08 Javascript
JQuery团队打造的javascript单元测试工具QUnit介绍
2010/02/26 Javascript
javascript下string.format函数补充
2010/08/24 Javascript
javascript attachEvent绑定多个事件执行顺序问题
2010/10/20 Javascript
读jQuery之六 缓存数据功能介绍
2011/06/21 Javascript
connect中间件session、cookie的使用方法分享
2014/06/17 Javascript
完美兼容IE,chrome,ff的设为首页、加入收藏及保存到桌面js代码
2014/12/17 Javascript
webapp框架AngularUI的demo改造之路
2014/12/21 Javascript
jQuery手机浏览器中拖拽动作的艰难性分析
2015/02/04 Javascript
JS截取字符串实例详解
2015/11/24 Javascript
webpack file-loader和url-loader的区别
2019/01/15 Javascript
jquery获取input输入框中的值
2019/11/13 jQuery
[44:50]DOTA2上海特级锦标赛B组小组赛#2 VG VS Fnatic第二局
2016/02/26 DOTA
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
详解python之简单主机批量管理工具
2017/01/27 Python
Python 爬虫图片简单实现
2017/06/01 Python
解决Atom安装Hydrogen无法运行python3的问题
2019/08/28 Python
Python-opencv 双线性插值实例
2020/01/17 Python
python高阶函数map()和reduce()实例解析
2020/03/16 Python
在python中求分布函数相关的包实例
2020/04/15 Python
Python中的wordcloud库安装问题及解决方法
2020/05/27 Python
HTML5 在canvas中绘制矩形附效果图
2014/06/23 HTML / CSS
HTML5 Canvas 旋转风车绘制
2017/08/18 HTML / CSS
手术室护士自我鉴定
2013/10/14 职场文书
文明寝室标语
2014/06/13 职场文书
11.9消防日宣传标语
2014/10/08 职场文书
期末复习计划
2015/01/19 职场文书
2015年教师党员自我评价材料
2015/03/04 职场文书
2015年检验科工作总结
2015/04/27 职场文书
毕业论文答辩开场白和结束语
2015/05/27 职场文书
亮剑观后感300字
2015/06/05 职场文书
餐馆开业致辞
2015/08/01 职场文书
2016应届毕业生实习心得体会
2015/10/09 职场文书
财务人员廉洁自律心得体会
2016/01/13 职场文书