Spring面试题整理

Spring 面试题

1. Spring框架有哪些模块?

Spring框架由七个模块组成组成,这7个模块(或组件)均可以单独存在,也可以与其它一个或多个模块联合使用,如下所示:

(1) Spring 核心容器——IoC容器

(2) Spring AOP

(3) Spring ORM

(4) Spring DAO

(5) Spring WEB

(6) Spring上下文(Context

(7) Spring MVC

 

2. 为什么要使用Spring框架,它有什么优点?

(1) 轻量级的框架

(2) 非侵入性的

(3) 可以整合其它的框架,比如Struts, Hibernate

(4) 可以提供事务管理

 

3.Spring框架的工作机制是什么?

(1) Spring MVC所有的请求都提交给DispatcherServlet,它会委托应用系统的其它模块负责对请求进行真正的处理工作。

(2) DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller

(3) DispatcherServlet请请求提交到目标Controller

(4) Controller进行业务逻辑处理后,会返回一个ModelAndView

(5) Dispathcher查询一个或多个ViewResolver(视图解析器)找到ModelAndView对象指定的视图对象

(6) 视图对象负责将结果返回给客户端。 

 

4.怎么使用Spring配置事务 ?

    Spring同时支持编程式事务策略和声明式事务策略,大部分时候都采用声明式事务策略。

声明式事务管理的配置方式,通常有以下4种:

(1) 使用TransactionProxyFactoryBean为目标Bean生成事务代理的配置。此方式是最传统、配置文件最臃肿、最难以阅读的方式。

(2) 采用Bean继承的事务代理配置方式,比较简洁,但依然是增量式配置。

(3) 采用BeanNameAutoProxyCreator,根据Bean Name自动生成事务代理的方式。这是直接利用SpringAOP框架配置事务代理的方式,需要对SpringAOP框架有所理解。但这种方式避免了增量式配置,效果非常不错。

(4) 采用DefaultAdvisorAutoProxyCreator,直接利用SpringAOP框架配置事务代理的方式,效果非常不错,只是这种配置方式的可读性不如第3种方式。

 

5.请你谈谈SSH整合

SSH整合:

(1) Struts(表示层)+ Spring(业务层)+ Hibernate(持久层) 

(2) Struts

Struts是一个表示层框架,主要作用是界面展示、接收请求和分发请求。

MVC框架中,Struts属于VC层次,负责界面表现,负责MVC关系的分发。

View:沿用 JSPHTTPFormTagResourse

ControllerActionServletstruts-config.xmlAction

(3) Hibernate

Hibernate是一个持久层框架,它只负责与关系数据库的操作。 

(4) Spring

Spring是一个业务层框架,是一个整合的框架,能够很好地黏合表示层与持久层。 

 

6.在Spring框架中如何配置数据库驱动?

使用org.springframework.jdbc.datasource.DriverManagerDataSource数据源来配置数据库驱动。

示例:
<bean id=”dataSource”> 
    <property name=”driverClassName”> <value>org.hsqldb.jdbcDriver</value> </property>
    <property name=”url”><value>jdbc:hsqldb:db/appfuse</value></property>
    <property name=”username”><value>sa</value></property>
    <property name=”password”><value></value></property>
</bean>

 

7.在Spring框架中applicationContext.xml文件能不能改成其它文件名?

ContextLoaderListener是一个ServletContextListener,在启动Tomcat应用服务器时,它会读取WEB-INF目录下的applicationContext.xml文件,初始化Spring配置

如果你想改变applicationContext.xml文件的名字或改变它的存储位置,可以通过在web.xml文件中定义一个<context-param>元素来解决这个问题。

示例:
<listener> 
    <listener-class>org.springframework.web.context.ContextLoaderListener 

<context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>/WEB-INF/xyz.xml</param-value> 
     </context-param>

</listener-class> 
</listener> 

8.如何在Web应用里配置Spring

在/WEB-INF/web.xml文件中,加入如下内容:

<servlet>

<servlet-name>context</servlet-name>

<servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup>

</servlet>

在启动Web应用服务器(Tomcat)时,将加载/WEB-INF/applicationContext.xml文件中的内容。

在应用程序中,可以通过如下方式获取ApplicationContext实例

WebApplicationContextUtils.getWebApplicationContext

9.Spring里如何定义Hibernate Mapping

添加hibernate mapping 文件到WEB-INF目录下的applicationContext.xml文件中。

示例:
<property name=”mappingResources”>
    <list>
        <value>org/appfuse/model/User.hbm.xml</value>
    </list>
</property>

10.解释一下Dependency Injection(DI,依赖注入)IoC(Inversion of Control,控制反转)?

依赖注入DI一种设计模式,通常也称作控制反转,尽管在技术上来讲,依赖注入是一个IoC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一种特殊的能力。例如,把一个数据库连接以参数的形式传到一个对象的构造函数里面而不是在那个对象内部自行创建一个连接。

控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖。

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

 

11. Spring中的BeanFactoryApplicationContext的作用有哪些?

(1) BeanFactory负责读取Bean配置文档,管理Bean的加载和实例化,维护Bean之间的依赖关系,负责Bean生命周期。

(2) ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能: 

a. 国际化支持

b. 资源访问:Resource rs = ctx. getResource(”classpath:config.properties”);

c. 事件传递:通过实现ApplicationContextAware接口

(3) 常用的获取ApplicationContext的方法:

FileSystemXmlApplicationContext:从文件系统或者URL指定的xml配置文件创建,参数为配置文件名或文件名数组

ClassPathXmlApplicationContext:从classpathxml配置文件创建,可以从jar包中读取配置文件

WebApplicationContextUtils:从web应用的根目录读取配置文件,需要先在web.xml中配置,可以配置监听器或者 servlet来实现 
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> 
</listener> 
<servlet> 
    <servlet-name>context</servlet-name> 
    <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
    这两种方式都默认配置文件为WEB-INF/applicationContext.xml,也可使用context-param指定配置文件

<context-param>

<param-name>contextConfigLocation</param-name>

<param-value>/WEB-INF/myApplicationContext.xml</param-value>

</context-param>

 

12. 如何在Spring中实现国际化

applicationContext.xml文件中配置一个bean
<bean id=”messageSource” class=”org.springframework.context.support.ResourceBundleMessageSource”>
    <property name=”basename”><value>message</value> </property> 
</bean>
     在src目录下建多个properties文件,其命名格式是message_语言_国家
     在页面中显示信息时,通过applictionContext.getMessage(“键名”,”参数”,”区域”)取出相关的信息。 

 

 

13. Spring中的核心类有那些,各有什么作用?

BeanFactory:产生一个新的实例,可以实现单例模式

BeanWrapper:提供统一的getset方法

ApplicationContext:提供Spring框架的实现,包括BeanFactory的所有功能

 

14. 什么是AOPAOP的作用是什么?

面向切面编程(AOP)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(OOP)的不足。

除了类(classes)以外,AOP提供了切面。切面对关注点进行模块化,例如横切多个类型和对象的事务管理

Spring的一个关键的组件就是AOP框架,可以自由选择是否使用AOP,提供声明式企业服务,特别是为了替代EJB声明式服务。最重要的服务是声明性事务管理,这个服务建立在Spring的抽象事物管理之上

允许用户实现自定义切面,用AOP来完善OOP的使用,可以把Spring AOP看作是对Spring的一种增强

 

15. 使用Spring有什么好处?

(1) Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仅使用了Struts或其它的包含了J2EE特有APIs的 framework,你会发现Spring关注了遗留问题。

(2) Spring能消除在许多工程上对Singleton的过多使用。

(3) Spring能消除使用各种格式的属性定制文件的需要,在整个工程中,可通过一种一致的方法来进行配置。曾经感到迷惑,一个特定类要查找迷幻般的属性关键字或系统属性,为此不得不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。

(4) Spring能通过接口而不是类促进好的编程习惯,减少编程代价到几乎为零。

(5) Spring被设计为让使用它创建的应用尽可能少的依赖于它的APIs。在Spring应用中的大多数业务对象没有依赖于Spring

(6) 使用Spring构建的应用程序易于单元测试。

(7) Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJOslocal EJBs来实现业务接口,却不会影响调用代码。

(8) Spring帮助你解决许多问题而无需使用EJBSpring能提供一种EJB的替换物,它们适于许多web应用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,甚至不需要JTA实现。

(9) Spring为数据存取提供了一致的框架,不论是使用JDBCO/R mapping产品(如Hibernate)。

 

16. 什么是Spring,它有什么特点?

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。

(1) 轻量——从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的JAR文件里发布,并且Spring所需的处理开销也是微不足道的。此外,Spring是非侵入式的:典型地,Spring应用中的对象不依赖于Spring的特定类。

(2) 控制反转——Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。你可以认为IoCJNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它。 

(3) 面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务管理)进行内聚性的开发。应用对象只实现它们应该做的——完成业务逻辑——仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。 

(4) 容器——Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring不应该被混同于传统的重量级的EJB容器,它们经常是庞大与笨重的,难以使用。 

(5) 框架——Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。 Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将应用逻辑的开发留给了你。

 

17. AOP里面几个重要名词概念的解释

(1) 切面(Aspect)

一个关注点的模块化,这个关注点可能会横切多个对象。事务管理是J2EE应用中一个关于横切关注点的很好的例子。 在Spring AOP中,切面可以使用通用类(基于模式的风格) 或者在普通类中以 @Aspect 注解来实现。 

(2) 连接点(Joinpoint)

在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候。 在Spring AOP中,一个连接点总是代表一个方法的执行。 通过声明一个org.aspectj.lang.JoinPoint类型的参数可以使通知(Advice)的主体部分获得连接点信息。 

(3) 通知(Advice)

在切面的某个特定的连接点(Joinpoint)上执行的动作。通知有各种类型,其中包括“around”“before”“after”等通知。 通知的类型将在后面部分进行讨论。许多AOP框架,包括Spring,都是以拦截器做通知模型,并维护一个以连接点为中心的拦截器链。 

(4) 切入点(Pointcut)

匹配连接点(Joinpoint)的断言。通知和一个切入点表达式关联,并在满足这个切入点的连接点上运行(例如,当执行某个特定名称的方法时)。 切入点表达式如何和连接点匹配是AOP的核心:Spring缺省使用AspectJ切入点语法。

(5) 引入(Introduction)

也被称为内部类型声明(inter-type declaration))。声明额外的方法或者某个类型的字段。 Spring允许引入新的接口(以及一个对应的实现)到任何被代理的对象。 例如,你可以使用一个引入来使bean实现 IsModified 接口,以便简化缓存机制。 

(6) 目标对象(Target Object)

被一个或者多个切面(aspect)所通知(advise)的对象。也有人把它叫做被通知(advised) 对象。 既然Spring AOP是通过运行时代理实现的,这个对象永远是一个被代理(proxied)对象。 

(7) AOP代理(AOP Proxy)

AOP框架创建的对象,用来实现切面契约(aspect contract)(包括通知方法执行等功能)。 在Spring中,AOP代理可以是JDK动态代理或者CGLIB代理。 注意:Spring 2.0最新引入的基于模式(schema-based)风格和@AspectJ注解风格的切面声明,对于使用这些风格的用户来说,代理的创建是透明的。 

(8) 织入(Weaving)

把切面(aspect)连接到其它的应用程序类型或者对象上,并创建一个被通知(advised)的对象。 这些可以在编译时(例如使用AspectJ编译器),类加载时和运行时完成。 Spring和其它纯Java AOP框架一样,在运行时完成织入。

18、 Spring Bean 有多种作用域,包括:

singletonprototyperequestsessionglobal sessionapplication、自定义

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值