spring的面试题大全(上)

来源:互联网 发布:电子病历软件下载 编辑:程序博客网 时间:2024/05/17 04:15

*  Spring的优点有什么?

1. Spring是分层的架构,你可以选择使用你需要的层而不用管不需要的部分

2. Spring是POJO编程,POJO编程使得可持续构建和可测试能力提高

3. 依赖注入和IoC使得JDBC操作简单化

4. Spring是开源的免费的

5. Spring使得对象管理集中化合简单化

*  描述一下spring中实现DI(dependency injection)的几种方式

方式一:接口注入,在实际中得到了普遍应用,即使在IOC的概念尚未确立时,这样的方法也已经频繁出现在我们的代码中。
方式二:Type2 IoC: Setter injection对象创建之后,将被依赖对象通过set方法设置进去
方式三:Type3 IoC: Constructor injection对象创建时,被依赖对象以构造方法参数的方式注入
Spring的方式

*  简单描述下IOC(inversion of control)的理解

一个类需要用到某个接口的方法,我们需要将类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的问题,可以添加OpenSessionInViewFilterOpenSessionInViewInterceptor

*  请介绍下spring的事务管理

spring提供了几个关于事务处理的类:
TransactionDefinition //事务属性定义
TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。

一般事务定义步骤:

TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try
{ //do sth
transactionManager.commit(ts);
}
catch(Exception e){transactionManager.rollback(ts);}

spring提供的事务管理可以分为两类:编程式的和声明式的。编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。

编程式主要使用transactionTemplate。省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.
void add()
{
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}

声明式:

使用TransactionProxyFactoryBean:

PROPAGATION_REQUIRED PROPAGATION_REQUIRED PROPAGATION_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”来实现。示例如下:
<bean id=”dataSource”>
    <property name=”jndiName”>
        <value>java:comp/env/jdbc/appfuse</value>
    </property>
</bean>

*  在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>

*  spring中的applicationContext.xml能不能改为其他名字

ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。缺省情况下, 它会在WEB-INF/applicationContext.xml文件找Spring的配置。 你可以通过定义一个<context-param>元素名字为”contextConfigLocation”来改变Spring配置文件的位置。示例如下:

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

*  在web中如何配置spring

J2EE的web应用里面配置spring非常简单,最简单的只需要把spring得ContextLoaderListener添加到你的web.xml文件里面就可以了,示例如下:
<listener>
    <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

*  在spring中如何定义hibernate Mapping?

添加hibernate mapping 文件到web/WEB-INF目录下的applicationContext.xml文件里面。示例如下:
<property name=”mappingResources”>
    <list>
        <value>org/appfuse/model/User.hbm.xml</value>
    </list>
</property>

*  两种依赖注入的类型是什么?

两种依赖注入的类型分别是setter注入和构造方法注入。

setter注入一般情况下所有的java bean, 我们都会使用setter方法和getter方法去设置和获取属性的值,示例如下:
public class namebean {
     String      name;  
     public void setName(String a) {
        name = a; }
     public String getName() {
        return name; }
    }
我们会创建一个bean的实例然后设置属性的值,spring的配置文件如下:
<bean id=”bean1″  >
   <property   name=”name” >
       <value>tom</value>
   </property>
</bean>
Spring会调用setName方法来只是name熟悉为tom
构造方法注入:构造方法注入中,我们使用带参数的构造方法如下:
public class namebean {
     String name;
     public namebean(String a) {
        name = a;
     }   
}
我们会在创建bean实例的时候以new namebean(”tom”)的方式来设置name属性, Spring配置文件如下:
<bean id=”bean1″ >
    <constructor-arg>
       <value>My Bean Value</value>
   </constructor-arg>
</bean>
使用constructor-arg标签来设置构造方法的参数。

*  解释一下Dependency Injection(DI)和IOC(inversion of control)?

参考答案:依赖注入DI是一个程序设计模式和架构模型, 一些时候也称作控制反转,尽管在技术上来讲,依赖注入是一个IOC的特殊实现,依赖注入是指一个对象应用另外一个对象来提供一个特殊的能力,例如:把一个数据库连接已参数的形式传到一个对象的结构方法里面而不是在那个对象内部自行创建一个连接。控制反转和依赖注入的基本思想就是把类的依赖从类内部转化到外部以减少依赖
应用控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用,传递给它。也可以说,依赖被注入到对象中。所以,控制反转是,关于一个对象如何获取他所依赖的对象的引用,这个责任的反转

*  SpringBeanFactoryApplicationContext的作用和区别

作用:

1. BeanFactory负责读取bean配置文档,管理bean的加载,实例化,维护bean之间的依赖关系,负责bean的声明周期。
2. ApplicationContext除了提供上述BeanFactory所能提供的功能之外,还提供了更完整的框架功能:

a. 国际化支持
b. 资源访问:Resource rs = 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来实现
<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>

*  web环境下如何配置applicationContext.xml文件

<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>
 通过如下方法取出applicationContext实例:
 ApplicationContext ac=WebApplicationContextUtils.getWebApplicationContext(this.getServletContext);

*  如何配置spring + struts

struts-config.xml加入一个插件,通过它加载applicationContext.xml
struts-config.xml修改action-mapping标记,具体action交给了DelegateActionProxyØ
通过DelegateActionProxy进入一spring的环境。u
spring的applicationContext.xml加入Ø<bean name=”/login” class=”" singleton=”false”/>

*  Springhibernate的配置文件中的主要类型有哪些?如何配置?

myeclipse中先加入spring环境再加入hibernate环境。
 如果spring与hibernate结合在一起可以不需要hibernate.cfg.xml文件是否正确?
 spring+hibernate的配置文件中的主要类有那些?如何配置?
  dataSource
  sessionFactory:hibernate.cfg.xml
  transactionManager
  userDao (extends HibernateDaoSupport) 
   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方法中使用。
public void make()
 { 
  TransactionTemplate jtm=new TransactionTemplate(this.getTransactionManager());
  jtm.execute(new myClass1());
 }
 public class myClass1 implements TransactionCallback
 {

  public Object doInTransaction(TransactionStatus trans)
  {
   JdbcTemplate jdbc=new JdbcTemplate(dataSource);
   jdbc.execute(”insert into customer(customerName) values(’b')”);
   jdbc.execute(”insert into customer(customerName) values(’b')”);
   return null;
  }  
 }
   容器管理的事务处理

*  spring中的jdbc与传统的jdbc有什么区别?

Spring的jdbc:节省代码,不管连接(Connection),不管事务、不管异常、不管关闭(con.close() ps.close )

  JdbcTemplate(dataSource):增、删、改、查
  TransactionTemplate(transactionManager):进行事务处理

*  Spring配置的主要标签有什么?有什么作用?

<beans>
   <bean id=”” class=”” init=”” destroy=”” singleton=””>
    <property name=””>
     <value></value>
    </property>
    <property name=””>
     <ref local></ref>
    </property>
   </bean>
</beans>

*  如何在spring中实现国际化?

applicationContext.xml加载一个bean
<bean id=”messageSource” class=”org.springframework.context.support.ResourceBundleMessageSource”>
  <property name=”basename”>
   <value>message</value>
  </property>
</bean>
 在src目录下建多个properties文件Ø
 对于非英文的要用native2asciiØ -encoding gb2312 源  目转化文件相关内容
 其命名格式是message_语言_国家。Ø
 页面中的中显示提示信息,键名取键值。Ø
 当给定国家,系统会自动加载对应的国家的properties信息。Ø
 通过applictionContext.getMessage(“键名”,”参数”,”区域”)取出相关的信息。Ø

*  spring中如何实现事件处理

事件
  Extends ApplicationEvent
监听器
  Implements ApplicationListener
事件源
  Implements ApplicationContextAware
applicationContext.xml中配置事件源、监听器
先得到事件源,调用事件源的方法,通知监听器。

*  如何将spring加入web容器中

web.xml中加入如下同容,在启动web服务器时加载/WEB-INF/applicationContext.xml中的内容。
<servlet>
<servlet-name>context</servlet-name>
<servlet-class>
org.springframework.web.context.ContextLoaderServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
通过如下类得到ApplicationContext实例
   WebApplicationContextUtils.getWebApplicationContext

*  Spring如何实现资源管理?

使用
applicationContext.getResource(“classpath:文件名”):在src根目录下,在类路径下
applicationContext.getResource(“classpath:/chap01/文件名”): 以src根目录下的基准往下走。
applicationContext.getResource(“file:c:/a.properties”):在系统文件目录下。

*  SpringApplicationContext的作用?

beanFactory
国际化(getMesage)
资源管理:可以直接读取一个文件的内容(getResource)
加入web框架中(加入一个servlet或监听器)
事件处理

*  spring的核心是什么,各有什么作用?

BeanFactory:产生一个新的实例,可以实现单例模式
BeanWrapper:提供统一的get及set方法
ApplicationContext:提供框架的实现,包括BeanFactory的所有功能

*  Springaop的关键名词有哪些?各有什么作用?

拦截器: 代理
装备(advice)
目标对象
关切点:条件
连接点:方法、属性

*  Springstruts的区别?

strusts:是一种基于MVC模式的一个web层的处理。
Spring:提供了通用的服务,ioc/di aop,关心的不仅仅web层,应当j2ee整体的一个服务,可以很容易融合不同的技术struts hibernate ibatis ejb remote springJDBC springMVC

*  springstruts的面试题

1.struts
Action是不是线程安全的?如果不是,有什么方式可以保证Action的线程安全?如果是,说明原因

2.MVC,分析一下struts是如何实现MVC的

3.struts中的几个关键对象的作用(说说几个关键对象的作用)

4.spring
说说AOP和IOC的概念以及在spring中是如何应用的

5.Hibernate有哪几种查询数据的方式

6.load()和get()的区别

回答:
1.Struts1 Action是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1 Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。
Struts2 Action对象为每一个请求产生一个实例,因此没有线程安全问题。(实际上,servlet容器给每个请求产生许多可丢弃的对象,并且不会导致性能和垃圾回收问题)

2.struts是用一组类,servlet 和jsp规范实现mvc的

3.ActionFrom ActionServlet Action struts-config.xml

4.spring的核心就是IOC,通过指定对象的创建办法,描述对象与服务之间的关系,而不生成对象

5.3种,hql 条件查询() 原生sql

6.load()方法认为该数据一定存在,可以放心的使用代理来延时加载 ,如果使用过程中发现了问题,就抛出异常;
get()方法一定要获取到真实的数据,否则返回null

原创粉丝点击