[ Java面试题 ] 框架篇

一、谈谈你对Struts的理解。前端

  1. struts是一个按MVC模式设计的Web层框架,其实它就是一个Servlet,这个Servlet名为ActionServlet,或是ActionServlet的子类。咱们能够在web.xml文件中将符合某种特征的全部请求交给这个Servlet处理,这个Servlet再参照一个配置文件将各个请求分别分配给不一样的action去处理。java

(struts的配置文件能够有多个,能够按模块配置各自的配置文件,这样能够防止配置文件的过分膨胀)web

  2.ActionServlet把请求交给action去处理以前,会将请求参数封装成一个formbean对象(就是一个java类,这个类中的每一个属性对应一个请求参数),spring

  3.要说明的是, ActionServlet把formbean对象传递给action的execute方法以前,可能会调用formbean的validate方法进行校验,只有校验经过后才将这个formbean对象传递给action的execute方法,不然,它将返回一个错误页面,这个错误页面由input属性指定。sql

  4.action执行完后要返回显示的结果视图,这个结果视图是用一个ActionForward对象来表示的,actionForward对象经过struts-config.xml配置文件中的配置关联到某个jsp页面,由于程序中使用的是在struts-config.xml配置文件为jsp页面设置的逻辑名,这样能够实现action程序代码与返回的jsp页面名称的解耦。数据库

 (以上,也能够结合本身使用感觉谈本身的见解)编程

 

二、谈谈你对Hibernate的理解。api

  1. 面向对象设计的软件内部运行过程能够理解成就是在不断建立各类新对象、创建对象之间的关系,调用对象的方法来改变各个对象的状态和对象消亡的过程,无论程序运行的过程和操做怎么样,本质上都是要获得一个结果,程序上一个时刻和下一个时刻的运行结果的差别就表如今内存中的对象状态发生了变化。缓存

  2.为了在关机和内存空间不够的情况下,保持程序的运行状态,须要将内存中的对象状态保存到持久化设备和从持久化设备中恢复出对象的状态,一般都是保存到关系数据库来保存大量对象信息。从Java程序的运行功能上来说,保存对象状态的功能相比系统运行的其余功能来讲,应该是一个很不起眼的附属功能,java采用jdbc来实现这个功能,这个不起眼的功能却要编写大量的代码,而作的事情仅仅是保存对象和恢复对象,而且那些大量的jdbc代码并无什么技术含量,基本上是采用一套例行公事的标准代码模板来编写,是一种苦活和重复性的工做。tomcat

  3.经过数据库保存java程序运行时产生的对象和恢复对象,其实就是实现了java对象与关系数据库记录的映射关系,称为ORM(即Object RelationMapping),人们能够经过封装JDBC代码来实现了这种功能,封装出来的产品称之为ORM框架,Hibernate就是其中的一种流行ORM框架。使用Hibernate框架,不用写JDBC代码,仅仅是调用一个save方法,就能够将对象保存到关系数据库中,仅仅是调用一个get方法,就能够从数据库中加载出一个对象。

  4.使用Hibernate的基本流程是:配置Configuration对象、产生SessionFactory、建立session对象,启动事务,完成CRUD操做,提交事务,关闭session。

  5.使用Hibernate时,先要配置hibernate.cfg.xml文件,其中配置数据库链接信息和方言等,还要为每一个实体配置相应的hbm.xml文件,hibernate.cfg.xml文件中须要登记每一个hbm.xml文件。

  6.在应用Hibernate时,重点要了解Session的缓存原理,级联,延迟加载和hql查询。

(以上,也能够结合本身使用JDBC时的繁琐谈hibernate的感觉)

 

三、谈谈你对Spring的理解。

  1.Spring是实现了工厂模式的工厂类(在这里有必要解释清楚什么是工厂模式),这个类名为BeanFactory(其实是一个接口),在程序中一般BeanFactory的子类ApplicationContext。Spring至关于一个大的工厂类,在其配置文件中经过<bean>元素配置用于建立实例对象的类名和实例对象的属性。

  2. Spring提供了对IOC良好支持,IOC是一种编程思想,是一种架构艺术,利用这种思想能够很好地实现模块之间的解耦,IOC也称为DI(Depency Injection)。

  3. Spring提供了对AOP技术的良好封装, AOP称为面向切面编程,就是系统中有不少各不相干的类的方法,在这些众多方法中要加入某种系统功能的代码,例如,加入日志,加入权限判断,加入异常处理,这种应用称为AOP。

  4.实现AOP功能采用的是代理技术,客户端程序再也不调用目标,而调用代理类,代理类与目标类对外具备相同的方法声明,有两种方式能够实现相同的方法声明,一是实现相同的接口,二是做为目标的子类。

  5.在JDK中采用Proxy类产生动态代理的方式为某个接口生成实现类,若是要为某个类生成子类,则能够用CGLI B。在生成的代理类的方法中加入系统功能和调用目标类的相应方法,系统功能的代理以Advice对象进行提供,显然要建立出代理对象,至少须要目标类和Advice类。spring提供了这种支持,只须要在spring配置文件中配置这两个元素便可实现代理和aop功能。

(以上,也能够结合本身使用感觉谈本身的见解)

 

四、谈谈Struts的优缺点
优势:
  1. 实现MVC模式,结构清晰,使开发者只关注业务逻辑的实现.

  2.有丰富的tag能够用 ,Struts的标记库(Taglib),如能灵活动用,则能大大提升开发效率

  3. 页面导航使系统的脉络更加清晰。经过一个配置文件,便可把握整个系统各部分之间的联系,这对于后期的维护有着莫大的好处。尤为是当另外一批开发者接手这个项目时,这种优点体现得更加明显。

  4. 提供Exception处理机制 .

  5. 数据库连接池管理

  6. 支持I18N

缺点:

  1.转到展现层时,须要配置forward,若是有十个展现层的jsp,须要配置十次struts,并且还不包括有时候目录、文件变动,须要从新修改forward,注意,每次修改配置以后,要求从新部署整个项目,而tomcate这样的服务器,还必须从新启动服务器

  2.Struts的Action必需是thread-safe方式,它仅仅容许一个实例去处理全部的请求。因此action用到的全部的资源都必需统一同步,这个就引发了线程安全的问题。

  3.测试不方便. Struts的每一个Action都同Web层耦合在一块儿,这样它的测试依赖于Web容器,单元测试也很难实现。不过有一个Junit的扩展工具Struts TestCase能够实现它的单元测试。

  4.类型的转换. Struts的FormBean把全部的数据都做为String类型,它可使用工具Commons-Beanutils进行类型转化。但它的转化都是在Class级别,并且转化的类型是不可配置的。类型转化时的错误信息返回给用户也是很是困难的。

  5.对Servlet的依赖性过强. Struts处理Action时必须要依赖ServletRequest和ServletResponse,全部它摆脱不了Servlet容器。

  6.前端表达式语言方面.Struts集成了JSTL,因此它主要使用JSTL的表达式语言来获取数据。但是JSTL的表达式语言在Collection和索引属性方面处理显得很弱。

  7.对Action执行的控制困难. Struts建立一个Action,若是想控制它的执行顺序将会很是困难。甚至你要从新去写Servlet来实现你的这个功能需求。

  8.对Action执行前和后的处理. Struts处理Action的时候是基于class的hierarchies,很难在action处理前和后进行操做。

  9.对事件支持不够.在struts中,实际是一个表单Form对应一个Action类(或DispatchAction),换一句话说:在Struts中实际是一个表单只能对应一个事件,struts这种事件方式称为application event,application event和component event相比是一种粗粒度的事件

 

五、iBatis与Hibernate有什么不一样?

相同点:屏蔽jdbc api的底层访问细节,使用咱们不用与jdbc api打交道,就能够访问数据。

    jdbc api编程流程固定,还将sql语句与java代码混杂在了一块儿,常常须要拼凑sql语句,细节很繁琐。

    ibatis的好处:屏蔽jdbc api的底层访问细节;将sql语句与java代码进行分离;提供了将结果集自动封装称为实体对象和对象的集合的功能,queryForList返回对象集合,用queryForObject返回单个对象;提供了自动将实体对象的属性传递给sql语句的参数。

  Hibernate是一个全自动的orm映射工具,它能够自动生成sql语句,ibatis须要咱们本身在xml配置文件中写sql语句,hibernate要比ibatis功能负责和强大不少。由于hibernate自动生成sql语句,咱们没法控制该语句,咱们就没法去写特定的高效率的sql。对于一些不太复杂的sql查询,hibernate能够很好帮咱们完成,可是,对于特别复杂的查询,hibernate就很难适应了,这时候用ibatis就是不错的选择,由于ibatis仍是由咱们本身写sql语句。

 

六、在hibernate进行多表查询每一个表中各取几个字段,也就是说查询出来的结果集没有一个实体类与之对应如何解决?

解决方案一:按照Object[]数据取出数据,而后本身组bean

解决方案二:对每一个表的bean写构造函数,好比表一要查出field1,field2两个字段,那么有一个构造函数就是Bean(type1filed1,type2field2) ,而后在hql里面就能够直接生成这个bean了。

 

七、介绍一下Hibernate的二级缓存

按照如下思路来回答:

  (1)首先说清楚什么是缓存

  (2)再说有了hibernate的Session就是一级缓存,即有了一级缓存,为何还要有二级缓存

  (3)最后再说如何配置Hibernate的二级缓存。

  1.缓存就是把之前从数据库中查询出来和使用过的对象保存在内存中(一个数据结构中),这个数据结构一般是或相似HashMap,当之后要使用某个对象时,先查询缓存中是否有这个对象,若是有则使用缓存中的对象,若是没有则去查询数据库,并将查询出来的对象保存在缓存中,以便下次使用。

  2.Hibernate的Session就是一种缓存,咱们一般将之称为Hibernate的一级缓存,当想使用session从数据库中查询出一个对象时,Session也是先从本身内部查看是否存在这个对象,存在则直接返回,不存在才去访问数据库,并将查询的结果保存在本身内部。

  因为Session表明一次会话过程,一个Session与一个数据库链接相关连,因此Session最好不要长时间保持打开,一般仅用于一个事务当中,在事务结束时就应关闭。而且Session是线程不安全的,被多个线程共享时容易出现问题。一般只有那种全局意义上的缓存才是真正的缓存应用,才有较大的缓存价值,所以,Hibernate的Session这一级缓存的缓存做用并不明显,应用价值不大。Hibernate的二级缓存就是要为Hibernate配置一种全局缓存,让多个线程和多个事务均可以共享这个缓存。咱们但愿的是一我的使用过,其余人也可使用,session没有这种效果。

  3.二级缓存是独立于Hibernate的软件部件,属于第三方的产品,多个厂商和组织都提供有缓存产品,例如,EHCache和OSCache等等。在Hibernate中使用二级缓存,首先就要在hibernate.cfg.xml配置文件中配置使用哪一个厂家的缓存产品,接着须要配置该缓存产品本身的配置文件,最后要配置Hibernate中的哪些实体对象要归入到二级缓存的管理中。明白了二级缓存原理和有了这个思路后,很容易配置起Hibernate的二级缓存。

  扩展知识:一个SessionFactory能够关联一个二级缓存,也即一个二级缓存只能负责缓存一个数据库中的数据,当使用Hibernate的二级缓存后,注意不要有其余的应用或SessionFactory来更改当前数据库中的数据,这样缓存的数据就会与数据库中的实际数据不一致。

 

八、JDO是什么?

  JDO是Java对象持久化的新的规范,为java data object的简称,也是一个用于存取某种数据仓库中的对象的标准化API。JDO提供了透明的对象存储,所以对开发人员来讲,存储数据对象彻底不须要额外的代码(如JDBC API的使用)。这些繁琐的例行工做已经转移到JDO产品提供商身上,使开发人员解脱出来,从而集中时间和精力在业务逻辑上。另外,JDO很灵活,由于它能够在任何数据底层上运行。

  比较:JDBC只是面向关系数据库(RDBMS)JDO更通用,提供到任何数据底层的存储功能,好比关系数据库、文件、XML以及对象数据库(ODBMS)等等,使得应用可移植性更强。

 

九、Hibernate的一对多和多对一双向关联的区别?

        一对多关联映射和多对一关联映射实现的基本原理都是同样的,既是在多的一端加入一个外键指向一的一端外键,而主要的区别就是维护端不一样。
        它们的区别在于维护的关系不一样:
一对多关联映射是指在加载一的一端数据的同时加载多的一端的数据多对一关联映射是指在加载多的一端数据的同时加载一的一端的数据。

 

十、Hibernate是如何延迟加载? 

  1. Hibernate2延迟加载实现:a)实体对象 b)集合(Collection) 

  2. Hibernate3 提供了属性的延迟加载功能 当Hibernate在查询数据的时候,数据并无存在与内存中,当程序真正对数据的操做时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提升了服务器的性能。  

 

十一、使用Spring框架的好处是什么?

  轻量:Spring 是轻量的,基本的版本大约2MB。

  控制反转:Spring经过控制反转实现了松散耦合,对象们给出它们的依赖,而不是建立或查找依赖的对象们。

  面向切面的编程(AOP):Spring支持面向切面的编程,而且把应用业务逻辑和系统服务分开。

  容器:Spring 包含并管理应用中对象的生命周期和配置。

  MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。

  事务管理:Spring 提供一个持续的事务管理接口,能够扩展到上至本地事务下至全局事务(JTA)。

  异常处理:Spring 提供方便的API把具体技术相关的异常(好比由JDBC,Hibernate or JDO抛出的)转化为一致的unchecked 异常。

 

十二、ApplicationContext一般的实现是什么?

  FileSystemXmlApplicationContext :此容器从一个XML文件中加载beans的定义,XML Bean 配置文件的全路径名必须提供给它的构造函数。

  ClassPathXmlApplicationContext:此容器也从一个XML文件中加载beans的定义,这里,你须要正确设置classpath由于这个容器将在classpath里找bean配置。

  WebXmlApplicationContext:此容器加载一个XML文件,此文件定义了一个WEB应用的全部bean。

 

1三、什么是Spring的依赖注入?有哪些方法进行依赖注入

  依赖注入,是IOC的一个方面,是个一般的概念,它有多种解释。这概念是说你不用建立对象,而只须要描述它如何被建立。你不在代码里直接组装你的组件和服务,可是要在配置文件里描述哪些组件须要哪些服务,以后一个容器(IOC容器)负责把他们组装起来。

  构造器依赖注入:构造器依赖注入经过容器触发一个类的构造器来实现的,该类有一系列参数,每一个参数表明一个对其余类的依赖。

  Setter方法注入:Setter方法注入是容器经过调用无参构造器或无参static工厂 方法实例化bean以后,调用该bean的setter方法,即实现了基于setter的依赖注入。

 

1四、什么是Spring beans?

  Spring beans 是那些造成Spring应用的主干的java对象。它们被Spring IOC容器初始化,装配,和管理。这些beans经过容器中配置的元数据建立。好比,以XML文件中<bean/> 的形式定义。

  Spring 框架定义的beans都是单件beans。在bean tag中有个属性”singleton”,若是它被赋为TRUE,bean 就是单件,不然就是一个 prototype bean。默认是TRUE,因此全部在Spring框架中的beans 缺省都是单件。

 

1五、解释Spring支持的几种bean的做用域。

Spring框架支持如下五种bean的做用域:

  singleton : bean在每一个Spring ioc 容器中只有一个实例。

  prototype:一个bean的定义能够有多个实例。

  request:每次http请求都会建立一个bean,该做用域仅在基于web的        Spring ApplicationContext情形下有效。

  session:在一个HTTP Session中,一个bean定义对应一个实例。该做用域仅在基于web的Spring ApplicationContext情形下有效。

  global-session:在一个全局的HTTP Session中,一个bean定义对应一个实例。该做用域仅在基于web的Spring ApplicationContext情形下有效。

缺省的Spring bean 的做用域是Singleton.

 

1六、解释Spring框架中bean的生命周期。

  1.Spring容器 从XML 文件中读取bean的定义,并实例化bean。

  2.Spring根据bean的定义填充全部的属性。

  3.若是bean实现了BeanNameAware 接口,Spring 传递bean 的ID 到 setBeanName方法。

  4.若是Bean 实现了 BeanFactoryAware 接口, Spring传递beanfactory 给setBeanFactory 方法。

  5.若是有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。

  6.若是bean实现IntializingBean了,调用它的afterPropertySet方法,若是bean声明了初始化方法,调用此初始化方法。

  7.若是有BeanPostProcessors 和bean 关联,这些bean的postProcessAfterInitialization() 方法将被调用。

  8.若是bean实现了 DisposableBean,它将调用destroy()方法。

 

1七、在 Spring中如何注入一个java集合?

Spring提供如下几种集合的配置元素:

  <list>类型用于注入一列值,容许有相同的值。

  <set> 类型用于注入一组值,不容许有相同的值。

  <map> 类型用于注入一组键值对,键和值均可觉得任意类型。

  <props>类型用于注入一组键值对,键和值都只能为String类型。

 

1八、解释不一样方式的自动装配

有五种自动装配的方式,用来指导Spring容器用自动装配方式进行依赖注入。

  no:默认的方式是不进行自动装配,经过显式设置ref 属性来进行装配。

  byName:经过参数名 自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byname,以后容器试图匹配、装配和该bean的属性具备相同名字的bean。

  byType::经过参数类型自动装配,Spring容器在配置文件中发现bean的autowire属性被设置成byType,以后容器试图匹配、装配和该bean的属性具备相同类型的bean。若是有多个bean符合条件,则抛出错误。

  constructor:这个方式相似于byType, 可是要提供给构造器参数,若是没有肯定的带参数的构造器参数类型,将会抛出异常。

  autodetect:首先尝试使用constructor来自动装配,若是没法工做,则使用byType方式。

 

1九、Spring框架的事务管理有哪些优势?

  它为不一样的事务API  如 JTA,JDBC,Hibernate,JPA 和JDO,提供一个不变的编程模式。

  它为编程式事务管理提供了一套简单的API而不是一些复杂的事务API如

  它支持声明式事务管理。

  它和Spring各类数据访问抽象层很好得集成。

 

20、什么是基于Java的Spring注解配置? 给一些注解的例子

  基于Java的配置,容许你在少许的Java注解的帮助下,进行你的大部分Spring配置而非经过XML文件。

  以@Configuration 注解为例,它用来标记类能够当作一个bean的定义,被Spring IOC容器使用。另外一个例子是@Bean注解,它表示此方法将要返回一个对象,做为一个bean注册进Spring应用上下文。

相关文章
相关标签/搜索