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...

面试题 相关文章推荐
PHP面试题及答案二
May 23 面试题
static关键字的用法
Oct 07 面试题
实现strstr功能,即在父串中寻找子串首次出现的位置
Aug 05 面试题
iostream与iostream.h的区别
Jan 16 面试题
android面试问题与答案
Dec 27 面试题
DBA的职责都有哪些
May 16 面试题
Discard Protocol抛弃协议的作用是什么
Oct 10 面试题
简述DNS进行域名解析的过程
Dec 02 面试题
Shell编程面试题
May 29 面试题
港湾网络笔试题
Apr 19 面试题
数字天堂软件测试面试题
Dec 23 面试题
介绍一下Python下range()函数的用法
Nov 07 面试题
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
改德生G88 - 加装等响度低音提升电路
2021/03/02 无线电
php中将汉字转换成拼音的函数代码
2012/09/08 PHP
PHP session文件独占锁引起阻塞问题解决方法
2015/05/12 PHP
php动态函数调用方法
2015/05/21 PHP
php往mysql中批量插入数据实例教程
2018/12/12 PHP
php面试实现反射注入的详细方法
2019/09/30 PHP
tp5 sum某个字段相加得到总数的例子
2019/10/18 PHP
php 命名空间(namespace)原理与用法实例小结
2019/11/13 PHP
JS 退出系统并跳转到登录界面的实现代码
2013/06/29 Javascript
JS删除字符串中重复字符方法
2014/03/09 Javascript
对js eval()函数的一些见解
2016/08/15 Javascript
JavaScript 动态三角函数实例详解
2017/01/08 Javascript
JS操作xml对象转换为Json对象示例
2017/03/25 Javascript
JS创建Tag标签的方法详解
2017/06/09 Javascript
基于vue,vue-router, vuex及addRoutes进行权限控制问题
2018/05/02 Javascript
微信小程序中的店铺评分组件及vue中用svg实现的评分显示组件
2018/11/16 Javascript
node.js中module模块的功能理解与用法实例分析
2020/02/14 Javascript
Python开发实例分享bt种子爬虫程序和种子解析
2014/05/21 Python
在Python的Django框架中加载模版的方法
2015/07/16 Python
Python实现代码统计工具(终极篇)
2016/07/04 Python
Python实现将一个正整数分解质因数的方法分析
2017/12/14 Python
pandas将DataFrame的列变成行索引的方法
2018/04/10 Python
Python3使用SMTP发送带附件邮件
2020/06/16 Python
Python实现登陆文件验证方法
2018/10/06 Python
pybind11和numpy进行交互的方法
2019/07/04 Python
python:按行读入,排序然后输出的方法
2019/07/20 Python
解决pycharm启动后总是不停的updating indices...indexing的问题
2019/11/27 Python
如何基于Python实现自动扫雷
2020/01/06 Python
软件测试题目
2013/02/27 面试题
司机的工作范围及职责
2013/11/13 职场文书
环保口号大全
2014/06/12 职场文书
临床专业自荐信
2014/06/22 职场文书
幼儿园爱国卫生月活动总结
2014/06/30 职场文书
2014年高校辅导员工作总结
2014/12/09 职场文书
Golang 正则匹配效率详解
2021/04/25 Golang
python如何利用cv2模块读取显示保存图片
2021/06/04 Python