Spring面试题集.docx
- 文档编号:26859613
- 上传时间:2023-06-23
- 格式:DOCX
- 页数:30
- 大小:33.36KB
Spring面试题集.docx
《Spring面试题集.docx》由会员分享,可在线阅读,更多相关《Spring面试题集.docx(30页珍藏版)》请在冰豆网上搜索。
Spring面试题集
Spring面试题集
*Spring的优点有什么
1.Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分
2.Spring是POJO编程,POJO编程使得可持续构建和可测试能力提高
3.依赖注入和IoC使得JDBC操作简单化
4.Spring是开源的免费的
5.Spring使得对象管理集中化合简单化
*描述一下spring中实现DI(dependencyinjection)的几种方式
方式一:
接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。
方式二:
Type2IoC:
Setterinjection对象创建之后,将被依赖对象通过set方法设置进去
方式三:
Type3IoC:
Constructorinjection对象创建时,被依赖对象以构造方法参数的方式注入
Spring的方式
*简单描述下IOC(inversionofcontrol)的理解
一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C的实例,但这种方法显然两者的依赖(Dependency)太大了。
而IoC的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的实现C放入IoC的容器(Container)中,通过一定的配置由容器(Container)来实现类A与接口B的实现C的关联。
*Spring对很多ORM框架提供了很好支持,描述下在spring使用hibernate的方法
在context中定义DataSource,创建SessionFactoy,设置参数;DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。
在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter或OpenSessionInViewInterceptor
*请介绍下spring的事务管理
spring提供了几个关于事务处理的类:
TransactionDefinition//事务属性定义
TranscationStatus//代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。
一般事务定义步骤:
TransactionDefinitiontd=newTransactionDefinition();
TransactionStatusts=transactionManager.getTransaction(td);
try
//dosth
transactionMmit(ts);
catch(Exceptione)transactionManager.rollback(ts);
spring提供的事务管理可以分为两类:
编程式的和声明式的。
编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式主要使用transactionTemplate。
省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.
voidadd()
transactionTemplate.execute(newTransactionCallback()
pulicObjectdoInTransaction(TransactionStatusts)
//dosth
声明式:
使用TransactionProxyFactoryBean:
PROPAGATION_REQUIREDPROPAGATION_REQUIREDPROPAGATION_REQUIRED,readOnly
围绕Poxy的动态代理能够自动的提交和回滚事务
org.springframework.transaction.interceptor.TransactionProxyFactoryBean
PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。
这是最常见的选择。
PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。
PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。
PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。
PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。
PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。
如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。
*如何在spring的applicationContext.xml使用JNDI而不是DataSource
可以使用”org.springframework.jndi.JndiObjectFactoryBean”来实现。
示例如下:
java:
comp/env/jdbc/appfuse
*在spring中是如何配置数据库驱动的
org.springframework.jdbc.datasource.DriverManagerDataSource”数据源来配置数据库驱动。
示例如下:
org.hsqldb.jdbcDriverjdbc:
hsqldb:
db/appfusesa
*spring中的applicationContext.xml能不能改为其他名字
ContextLoaderListener是一个ServletContextListener,它在你的web应用启动的时候初始化。
缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。
你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring配置文件的位置。
示例如下:
org.springframework.web.context.ContextLoaderListener
contextConfigLocation/WEB-INF/xyz.xml
*在web中如何配置spring
在J2EE的web应用里面配置spring非常简单,最简单的只需要把spring得ContextLoaderListener添加到你的web.xml文件里面就可以了,示例如下:
org.springframework.web.context.ContextLoaderListener*在spring中如何定义hibernateMapping
添加hibernatemapping文件到web/WEB-INF目录下的applicationContext.xml文件里面。
示例如下:
org/appfuse/model/User.hbm.xml*两种依赖注入的类型是什么
两种依赖注入的类型分别是setter注入和构造方法注入。
setter注入:
一般情况下所有的javabean,我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下:
publicclassnamebean
Stringname;
publicvoidsetName(Stringa)
name=a;
publicStringgetName()
returnname;
我们会创建一个bean的实例然后设置属性的值,spring的配置文件如下:
tom
Spring会调用setName方法来只是name熟悉为tom
构造方法注入:
构造方法注入中,我们使用带参数的构造方法如下:
publicclassnamebean
Stringname;
publicnamebean(Stringa)
name=a;
我们会在创建bean实例的时候以newnamebean(”tom”)的方式来设置name属性,Spring配置文件如下:
MyBeanValue
使用constructor-arg标签来设置构造方法的参数。
*解释一下DependencyInjection(DI)和IOC(inversionofcontrol)
参考答案:
依赖注入DI是一个程序设计模式和架构模型,一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:
把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。
控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。
也可以说,依赖被注入到对象中。
所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转
*Spring中BeanFactory和ApplicationContext的作用和区别
作用:
1.BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2.ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:
a.国际化支持
b.资源访问:
Resourcers=ctx.getResource(”classpath:
config.properties”),“file:
c:
/config.properties”
c.事件传递:
通过实现ApplicationContextAware接口
3.常用的获取ApplicationContext的方法:
FileSystemXmlApplicationContext:
从文件系统或者url指定的xml配置文件创建,参数为配置文件名或文件名数组
ClassPathXmlApplicationContext:
从classpath的xml配置文件创建,可以从jar包中读取配置文件
WebApplicationContextUtils:
从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者servlet来实现
org.springframework.web.context.ContextLoaderListener
context
org.springframework.web.context.ContextLoaderServlet
1
这两种方式都默认配置文件为web-inf/applicationContext.xml,也可使用context-param指定配置文件
contextConfigLocation/WEB-INF/myApplicationContext.xml
*在web环境下如何配置applicationContext.xml文件
org.springframework.web.context.ContextLoaderListener或:
context
org.springframework.web.context.ContextLoaderServlet
1
通过如下方法取出applicationContext实例:
ApplicationContextac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext);
*如何配置spring+struts
在struts-config.xml加入一个插件,通过它加载applicationContext.xml
在struts-config.xml修改action-mapping标记,具体action交给了DelegateActionProxy
通过DelegateActionProxy进入一spring的环境。
在spring的applicationContext.xml加入
*Spring和hibernate的配置文件中的主要类型有哪些如何配置
在myeclipse中先加入spring环境再加入hibernate环境。
如果spring与hibernate结合在一起可以不需要hibernate.cfg.xml文件是否正确
spring+hibernate的配置文件中的主要类有那些如何配置
dataSource
sessionFactory:
hibernate.cfg.xml
transactionManager
userDao(extendsHibernateDaoSupport)
sessionFactory
facade
proxy
sessionFactory
transactionManager
facade
*在spring中如何配置容器的事物管理,相关的类有哪些
Datasouce
transactionManager
userDao要注入
Datasouce
Proxy代理
Target:
userDao:
代理对象(目标对象)
transactionAttributes(那些方法需要事务处理)
transactionManager(事务处理服务)
*在spring中如何配代码的事务管理器
Datasouce
transactionManager
userDao要注入
Datasouce
transactionManager
通过如下类实现
TransactionTemplate
JdbcTemplate
*Spring中有几种事物管理,分别是什么
代码管理的事务处理
TransactonTemplate的execute方法中的内部类TransactionCallback中的doInTransaction方法中使用。
publicvoidmake()
TransactionTemplatejtm=newTransactionTemplate(this.getTransactionManager());
jtm.execute(newmyClass1());
publicclassmyClass1implementsTransactionCallback
publicObjectdoInTransaction(TransactionStatustrans)
JdbcTemplatejdbc=newJdbcTemplate(dataSource);
jdbc.execute(”insertintocustomer(customerName)values(’b)”);
jdbc.execute(”insertintocustomer(customerName)values(’b)”);
returnnull;
容器管理的事务处理
*spring中的jdbc与传统的jdbc有什么区别
Spring的jdbc:
节省代码,不管连接(Connection),不管事务、不管异常、不管关闭(con.close()ps.close)
JdbcTemplate(dataSource):
增、删、改、查
TransactionTemplate(transactionManager):
进行事务处理
*Spring配置的主要标签有什么有什么作用
*如何在spring中实现国际化
在applicationContext.xml加载一个bean
message
在src目录下建多个properties文件
对于非英文的要用native2ascii-encodinggb2312源目转化文件相关内容
其命名格式是message_语言_国家。
页面中的中显示提示信息,键名取键值。
当给定国家,系统会自动加载对应的国家的properties信息。
通过applictionContext.getMessage(“键名”,”参数”,”区域”)取出相关的信息。
*在spring中如何实现事件处理
事件
ExtendsApplicationEvent
监听器
ImplementsApplicationListener
事件源
ImplementsApplicationContextAware
在applicationContext.xml中配置事件源、监听器
先得到事件源,调用事件源的方法,通知监听器。
*如何将spring加入web容器中
在web.xml中加入如下同容,在启动web服务器时加载/WEB-INF/applicationContext.xml中的内容。
context
org.springframework.web.context.ContextLoaderServlet
1
通过如下类得到ApplicationContext实例
WebApplicationContextUtils.getWebApplicationContext
*Spring如何实现资源管理
使用
applicationContext.getResource(“classpath:
文件名”):
在src根目录下,在类路径下
applicationContext.getResource(“classpath:
/chap01/文件名”):
以src根目录下的基准往下走。
applicationContext.getResource(“file:
c:
/a.properties”):
在系统文件目录下。
*Spring的ApplicationContext的作用
beanFactory
国际化(getMesage)
资源管理:
可以直接读取一个文件的内容(getResource)
加入web框架中(加入一个servlet或监听器)
事件处理
*spring的核心是什么,各有什么作用
BeanFactory:
产生一个新的实例,可以实现单例模式
BeanWrapper:
提供统一的get及set方法
ApplicationContext:
提供框架的实现,包括BeanFactory的所有功能
*Spring中aop的关键名词有哪些各有什么作用
拦截器:
代理
装备(advice)
目标对象
关切点:
条件
连接点:
方法、属性
*Spring与struts的区别
strusts:
是一种基于MVC模式的一个web层的处理。
Spring:
提供了通用的服务,ioc/diaop,关心的不仅仅web层,应当j2ee整体的一个服务,可以很容易融合不同的技术strutshibernateibatisejbremotespringJDBCspringMVC
*spring与struts的面试题
1.struts
Action是不是线程安全的如果不是,有什么方式可以保证Action的线程安全如果是,说明原因
2.MVC,分析一下struts是如何实现MVC的
3.struts中的几个关键对象的作用(说说几个关键对象的作用)
4.spring
说说AOP和IOC的概念以及在spring中是如何应用的
5.Hibernate有哪几种查询数据的方式
6.load()和get()的区别
回答:
1.Struts1Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。
单例策略限制了Struts1Action能作的事,并且要在开发时特别小心。
Action资源必须是线程安全的或同步的。
Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。
(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)
2.struts是用一组类,servlet和jsp规范实现mvc的
3.ActionFromActionServletActionstruts-config.xml
4.spring的核心就是IOC,通过指定对象的创建办法,描述对象与服务之间的关系,而不生成对象
5.3种,hql条件查询()原生sql
6.load()方法认为该数据一定存在,可以放心的使用代理来延时加载,如果使用过程中发现了问题,就抛出异常;
get()方法一定要获取到真实的数据,否则返回null
*Spring,hibernate,struts面试题
Hibernate工作原理及为什么要用
原理:
1.读取并解析配置文件
2.读取并解析映射信息,创建SessionFactory
3.打开Sesssion
4.创建事务Transation
5.持久化操作
6.提交事务
7.关闭Session
8.关闭SesstionFactory
为什么要用:
*对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。
*Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。
他很大程度的简化DAO层的编码工作
*hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。
*hibernate的性能非常好,因为它是个轻量级框架。
映射的灵活性很出色。
它支持各种关系数据库,从一对一到多对多的各种复杂关系。
Hibernate是如何延迟加载
*Hibernate2延迟加载实现:
a)实体对象b)集合(Collection)
*Hibernate3提供了属性的延迟加载功能
当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。
Hibernate中怎样实现类之间的关系(如:
一对多、多对多的关系)
类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、
说下Hibernate的缓存机制
*内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存
*二级缓存:
a)应用及缓存
b)分布式缓存
条件:
数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非关键数据
c)第三方缓存的实现
Hibernate的查询方式
Sql、Criteria,objectcomptosition
Hql:
*属性查询
*
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Spring 试题