java中三大框架和项目模拟面试题目

更新时间:2024-06-26 20:15:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

框架和项目模拟面试题目

-------- 于洋 整理

1. Struts2 框架题目

1.1. struts2 工作流程

Struts 2框架本身大致可以分为3个部分:

核心控制器FilterDispatcher、业务控制器Action和用户实现的企业业务逻辑组件。

核心控制器FilterDispatcher是Struts 2框架的基础,

包含了框架内部的控制流程和处理机制。

业务控制器Action和业务逻辑组件是需要用户来自己实现的。

用户在开发Action和业务逻辑组件的同时,还需要编写相关的配置文件, 供核心控制器FilterDispatcher来使用。

Struts 2的工作流程相对于Struts 1要简单,与WebWork框架基本相同,

所以说Struts 2是WebWork的升级版本。基本简要流程如下: 1 、客户端初始化一个指向Servlet容器的请求; 2、 这个请求经过一系列的过滤器(Filter)

(这些过滤器中有一个叫做ActionContextCleanUp的可选过滤器,

这个过滤器对于Struts2和其他框架的集成很有帮助,例如:SiteMesh Plugin) 3 、接着FilterDispatcher被调用, FilterDispatcher询问ActionMapper来决定这个请是否需要调用某个Action 4、如果ActionMapper决定需要调用某个Action, FilterDispatcher把请求的处理交给ActionProxy

5、ActionProxy通过Configuration Manager询问框架的配置文件, 找到需要调用的Action类

6、ActionProxy创建一个ActionInvocation的实例。 7、ActionInvocation实例使用命名模式来调用, 在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用。

8、一旦Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到对应的返回结果 。返回结果通常是(但不总是,也可 能是另外的一个Action链)一个需要被表示的JSP或者FreeMarker的模版。 在表示的过程中可以使用Struts2 框架中继承的标签。 在这个过程中需要涉及到ActionMapper

9、响应的返回是通过我们在web.xml中配置的过滤器

10、如果ActionContextCleanUp是当前使用的,则FilterDispatecher将不会清理sreadlocal ActionContext;如果ActionContextCleanUp不使用,则将会去清理sreadlocals。

1.2. 过滤器Filter和struts2拦截器的区别

1、拦截器是基于java反射机制的,而过滤器是基于函数回调的。 2、过滤器依赖于servlet容器,而拦截器不依赖于servlet容器。

3、拦截器只能对Action请求起作用,而过滤器则可以对几乎所有请求起作用。 4、拦截器可以访问Action上下文、值栈里的对象,而过滤器不能。

1.3. 为什么要使用struts2框架

Struts2 是一个相当强大的Java Web开源框架,是一个基于POJO的Action的MVC Web框架。它基于当年的Webwork和XWork框架,继承其优点,同时做了相当的改进。

1.Struts2基于MVC架构,框架结构清晰,开发流程一目了然,开发人员可以很好的掌控开发的过程。

2使用OGNL进行参数传递。

OGNL提供了在Struts2里访问各种作用域中的数据的简单方式,你可以方便的获取Request,Attribute,Application,Session,Parameters中的数据。大大简化了开发人员在获取这些数据时的代码量。 3强大的拦截器

Struts2 的拦截器是一个Action级别的AOP,Struts2中的许多特性都是通过拦截器来实现的,例如异常处理,文件上传,验证等。拦截器是可配置与重用的,可以将一些通用的功能如:登录验证,权限验证等置于拦截器中以完成一些Java Web项目中比较通用的功能。在我实现的的一Web项目中,就是使用Struts2的拦截器来完成了系统中的权限验证功能。 4易于测试

Struts2的Action都是简单的POJO,这样可以方便的对Struts2的Action编写测试用例,大大方便了5Java Web项目的测试。

易于扩展的插件机制在Struts2添加扩展是一件愉快而轻松的事情,只需要将所需要的Jar包放到WEB-INF/lib文件夹中,在struts.xml中作一些简单的设置就可以实现扩展。 6模块化管理

Struts2已经把模块化作为了体系架构中的基本思想,可以通过三种方法来将应用程序模块化:将配置信息拆分成多个文件把自包含的应用模块创建为插件创建新的框架特性,即将与特定应用无关的新功能组织成插件,以添加到多个应用中去。 7全局结果与声明式异常

为应用程序添加全局的Result,和在配置文件中对异常进行处理,这样当处理过程中出现指定异常时,可以跳转到特定页面。

他的如此之多的优点,是很多人比较的青睐,与spring ,Hibernate进行结合,组成了现在比较流行的ssh框架,当然每个公司都要自己的框架,也是ssh变异的产品。

1.4. struts2 有哪些优点

1)在软件设计上Struts2的应用可以不依赖于Servlet API和struts API。 Struts2的这种设计属于无侵入式设计;

2)拦截器,实现如参数拦截注入等功能;

3)类型转换器,可以把特殊的请求参数转换成需要的类型; 4)多种表现层技术,如:JSP、freeMarker、Velocity等; 5)Struts2的输入校验可以对指定某个方法进行校验;

6)提供了全局范围、包范围和Action范围的国际化资源文件管理实现

1.5. struts2 框架的核心控制器是什么?它有什么作用?

1)Struts2框架的核心控制器是StrutsPrepareAndExecuteFilter。 2)作用:

负责拦截由/*指定的所有用户请求,当用户请求到达时,该Filter会过滤用户的请求。默认情况下,如果用户请求的路径

不带后缀或者后缀以.action结尾,这时请求将被转入struts2框架处理,否则struts2框架将略过该请求的处理。

可以通过常量\修改action的后缀,如:

如果用户需要指定多个请求后缀,则多个后缀之间以英文逗号(,)隔开。

1.6. struts2的配置文件的加载顺序

struts2 core 核心包 org/apache/struts2/default.properties (定义Struts2 常量)

struts2 core 核心包 struts-default.xml (定义struts2 默认 package 、 拦截器、 结果类型) struts2 plugin 插件包 struts-plugin.xml(定义struts2 插件的配置) struts.xml (自定义struts2 配置文件)

struts.properties (自定义struts2 常量文件) web.xml 中定义的struts2 常量

1.7. struts2 如何访问HttpServletRequest、HttpSession、

ServletContext 三个域对象?

方案一:

HttpServletRequest request =ServletActionContext.getRequest(); HttpServletResponse response =ServletActionContext.getResponse(); HttpSession session= request.getSession();

ServletContext servletContext=ServletActionContext.getServletContext();

方案二: 类 implements ServletRequestAware,ServletResponseAware,SessionAware,ServletContextAware

注意:框架自动传入对应的域对象

ps:ActionContext.getContext() 可以获得三个Map对象,间接对三个域对象中数据进行操作

1.8. struts2如何对指定的方法进行验证?

1)validate()方法会校验action中所有与execute方法签名相同的方法;

2)要校验指定的方法通过重写validateXxx()方法实现, validateXxx()只会校验action中方法名为Xxx的方法。其中Xxx的第一个字母要大写;

3)当某个数据校验失败时,调用addFieldError()方法往系统的fieldErrors添加校验失败信息

(为了使用addFieldError()方法,action可以继承ActionSupport), 如果系统 的fieldErrors包含失败信息,struts2会将请求转发到名为input的result; 4)在input视图中可以通过显示失败信息。

5)先执行validateXxxx()->validate()->如果出错了,会转发

1.9. struts2 默认能解决get和post乱码问题吗

不能。struts.i18n.encoding=UTF-8属性值只能解析POST提交下的乱码问题。

1.10. 请说出struts2中至少5个默认拦截器

fileUpload 提供文件上传功能 i18n 记录用户选择的locale

cookies 使用配置的name,value来是指cookies

checkbox 添加了checkbox自动处理代码,将没有选中的checkbox的内容设定为false,而html默认情况下不提交没有选中的checkbox。

chain 让前一个Action的属性可以被后一个Action访问,现在和chain类型的result()结合使用。

params 将请求参数封装到Struts2 Action中 validate 执行struts2 的请求参数校验

workflow 判断流程中是否存在FieldError ,如果存在,跳转到input对象视图

modelDriven 将struts2 Action 实现ModelDriven 接口提供model对象压入root栈顶部 token 防止页面表单重复提交

1.11. 值栈ValueStack的原理和生命周期

1)ValueStack贯穿整个 Action 的生命周期,保存在request域中,所以ValueStack和request的生命周期一样。当Struts2接受一个请求时,会迅速创建ActionContext,

ValueStack,action。然后把action存放进ValueStack,所以action的实例变量可以被OGNL访问。 请求来的时候,action、ValueStack的生命开始,请求结束,action、 ValueStack的生命结束;

2)action是多例的,和Servlet不一样,Servelt是单例的; 3)每个action的都有一个对应的值栈,值栈存放的数据类型是该action的实例,以及该action中的实例变量,Action对象默认保存在栈顶; 4)ValueStack本质上就是一个ArrayList;

5)关于ContextMap,Struts 会把下面这些映射压入 ContextMap 中: parameters : 该 Map 中包含当前请求的请求参数

request : 该 Map 中包含当前 request 对象中的所有属性 session :该 Map 中包含当

前 session 对象中的所有属性

application :该 Map 中包含当前 application 对象中的所有属性

attr:该 Map 按如下顺序来检索某个属性: request, session, application

6)使用OGNL访问值栈的内容时,不需要#号,而访问request、session、application、attr时,需要加#号;

7)注意: Struts2中,OGNL表达式需要配合Struts标签才可以使用。如:

8)在struts2配置文件中引用ognl表达式 ,引用值栈的值 ,此时使用的\,而不是#或者%;

1.12. ActionContext、ServletContext、pageContext区别?

1)ActionContext是当前的Action的上下文环境,通过ActionContext可以获取到request、session、ServletContext等与Action有关的对象的引用;

2)ServletContext是域对象,一个web应用中只有一个ServletContext,生命周期伴随整个web应用;

3)pageContext是JSP中的最重要的一个内置对象,可以通过pageContext获取其他域对象的应用,同时它是一个域对象,作用范围只针对当前页面,当前页面结束时,pageContext销毁, 生命周期是JSP四个域对象中最小的。

1.13. resul的type属性中有哪些结果类型?

dispatcher struts默认的结果类型,把控制权转发给应用程序里的某个资源不能把控制权转发给一个外部资源,若需要把控制权重定向到一个外部资源, 应该使用 redirect 把响应重定向到另一个资源(包括一个外部资源) redirectAction 把响应重定向到另一个 Action

freemarker、velocity、chain、httpheader、xslt、plainText、stream

struts2-json-plugin 自定义 json 结果类型,用于返回json格式数据

1.14. 拦截器的生命周期与工作过程

1)每个拦截器都是实现了Interceptor接口的 Java 类;

2)init(): 该方法将在拦截器被创建后立即被调用, 它在拦截器的生命周期内只被调用一次. 可以在该方法中对相关资源进行必要的初始化;

3)intercept(ActionInvocation invocation): 每拦截一个动作请求, 该方法就会被调用一次; 4)destroy: 该方法将在拦截器被销毁之前被调用, 它在拦截器的生命周期内也只被调用一次;

2. Hibernate3 框架题目

2.1. 为什么要使用Hibernate框架?它有什么优势?

? Hibernate对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性

代码。

? Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现,它很大程度

的简化了DAO层编码工作。

? Hibernate使用Java的反射机制,而不是字节码增强程序类实现透明性。

? 因为它是一个轻量级框架。映射的灵活性很出色。它支持很多关系型数据库,从一对一

到多对多的各种复杂关系。

2.2. Hibernate工作原理(编程步骤)

1.读取并解析Hibernate核心配置文件hibernate.cfg.xml 2.读取并解析Hibernate映射文件,创建SessionFactory 3.打开Sesssion yantingxin 4.创建事务Transation 5.持久化操作 6.提交事务 7.关闭Session

8.关闭SesstionFactory

2.3. Hibernate是如何实现延迟加载的?

延迟加载机制是为了避免一些无谓的性能开销而提出来的,所谓延迟加载就是当在真正需要数据的时候,才真正执行数据加载操作。在Hibernate中提供了对实体对象的延迟加载、对集合的延迟加载和对属性的延迟加载。

当Hibernate在查询数据的时候,数据并没有存储在内存中,只是使用Javassist为目标类创建子类代理对象,当程序真正对数据的进行操作时,代理对象的handler才去访问数据,加载对象存在于内存中,这就实现了延迟加载,它节省了服务器的内存开销,从而提高了服务器的性能。

2.4. Hibernate 有那几种查询方式

(1) 导航对象图查询

(2) OID查询 (3) HQL查询 (4) QBC查询

(5) 本地SQL查询

2.5. Hibernate中load方法和get方法区别

区别1:如果数据库中没有userId对应的记录,通过get方法加载,则返回的是null值;如果通过load方法加载,则返回一个代理对象,当通过user对象调用某个方法(比如user.getPassword())时,会抛出异常:org.hibernate.ObjectNotFoundException;

区别2:load支持延迟加载,get不支持延迟加载。

2.6. Hibernate持久化对象有几种状态?

临时状态、游离状态、持久化状态

2.7. HQL和SQL语句的区别?

HQL面向对象,而SQL操纵关系型数据库

2.8. 说下Hibernate的缓存机制

缓存是介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频次,从而提高了应用的运行性能。

Hibernate的缓存包括Session的缓存和SessionFactory的缓存,其中SessionFactory的缓存又可以分为两类:内置缓存和外置缓存。Session的缓存是内置的,不能被卸载,也被称为Hibernate的第一级缓存。SessionFactory的内置缓存和Session的缓存在实现方式上比较相似,前者是SessionFactory对象的一些集合属性包含的数据,后者是指Session的一些集合属性包含的数据。SessionFactory的内置缓存中存放了映射元数据和预定义SQL语句,映射元数据是映射文件中数据的拷贝,而预定义SQL语句是在Hibernate初始化阶段根据映射元数据推导出来,SessionFactory的内置缓存是只读的,应用程序不能修改缓存中的映射元数据和预定义SQL语句,因此SessionFactory不需要进行内置缓存与映射文件的同步。SessionFactory的外置缓存是一个可配置的插件。在默认情况下,SessionFactory不会启用这个插件。外置缓存的数据是数据库数据的拷贝,外置缓存的介质可以是内存或者硬盘。SessionFactory的外置缓存也被称为Hibernate的第二级缓存。

2.9. 如何优化Hibernate?

初用HIBERNATE的人也许都遇到过性能问题,实现同一功能,用HIBERNATE与用JDBC性能相差十几倍很正常,如果不及早调整,很可能影响整个项目的进度。

大体上,对于HIBERNATE性能调优的主要考虑点如下: ? 数据库设计调整 ? HQL优化

? API的正确使用(如根据不同的业务类型选用不同的集合及查询API) ? 主配置参数(日志,查询缓存,fetch_size, batch_size等)

? 映射文件优化(ID生成策略,二级缓存,延迟加载,关联优化) ? 一级缓存的管理

? 针对二级缓存,还有许多特有的策略 ? 事务控制策略。

1、 数据库设计

a) 降低关联的复杂性 b) 尽量不使用联合主键

c) ID的生成机制,不同的数据库所提供的机制并不完全一样 d) 适当的冗余数据,不过分追求高范式 2、 HQL优化

HQL如果抛开它同HIBERNATE本身一些缓存机制的关联,HQL的优化技巧同普通的SQL优化技巧一样,可以很容易在网上找到一些经验之谈。

在性能瓶颈的地方使用硬编码的 JDBC。 3、 主配置

a) 查询缓存,同下面讲的缓存不太一样,它是针对HQL语句的缓存,即完全一样的语句再次执行时可以利用缓存数据。但是,查询缓存在一个交易系统(数据变更频繁,查询条件相同的机率并不大)中可能会起反作用:它会白白耗费大量的系统资源但却难以派上用场。 b) fetch_size,同JDBC的相关参数作用类似,参数并不是越大越好,而应根据业务特征去设置

c) batch_size同上。

d) 生产系统中,切记要关掉SQL语句打印。 4、 缓存

a) 数据库级缓存:这级缓存是最高效和安全的,但不同的数据库可管理的层次并不一样,比如,在ORACLE中,可以在建表时指定将整个表置于缓存当中。 b) SESSION缓存:在一个HIBERNATE SESSION有效,这级缓存的可干预性不强,大多于HIBERNATE自动管理,但它提供清除缓存的方法,这在大批量增加/更新操作是有效的。比如,同时增加十万条记录,按常规方式进行,很可能会发现OutofMemeroy的异常,这时可能需要手动清除这一级缓存:Session.evict以及Session.clear

c) 应用缓存:在一个SESSIONFACTORY中有效,因此也是优化的重中之重,因此,各类策略也考虑的较多,在将数据放入这一级缓存之前,需要考虑一些前提条件: i. 数据不会被第三方修改(比如,是否有另一个应用也在修改这些数据?) ii. 数据不会太大

iii. 数据不会频繁更新(否则使用CACHE可能适得其反) iv. 数据会被频繁查询

v. 数据不是关键数据(如涉及钱,安全等方面的问题)。

缓存有几种形式,可以在映射文件中配置:read-only(只读,适用于很少变更的静态数据/历史数据),nonstrict-read-write,read-write(比较普遍的形式,效率一般),transactional(JTA中,且支持的缓存产品较少)

d) 分布式缓存:同c)的配置一样,只是缓存产品的选用不同,在目前的HIBERNATE中可供选择的不多,oscache, jboss cache,目前的大多数项目,对它们的用于集群的使用(特别是关键交易系统)都持保守态度。在集群环境中,只利用数据库级的缓存是最安全的。 5、 延迟加载

a) 实体延迟加载:通过使用动态代理实现

b) 集合延迟加载:通过实现自有的SET/LIST,HIBERNATE提供了这方面的支持 c) 属性延迟加载: 6、 方法选用

a) 完成同样一件事,HIBERNATE提供了可供选择的一些方式,但具体使用什么方式,可能用性能/代码都会有影响。显示,一次返回十万条记录(List/Set/Bag/Map等)进行处理,很可能导致内存不够的问题,而如果用基于游标(ScrollableResults)或Iterator的结果集,则不存在这样的问题。

b) Session的load/get方法,前者会使用二级缓存,而后者则不使用。

c) Query和list/iterator,如果去仔细研究一下它们,你可能会发现很多有意思的情况,二者主要区别(如果使用了Spring,在HibernateTemplate中对应find,iterator方法): i. list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但list查出的对象会写入二级缓存,但它一般只生成较少的执行SQL语句,很多情况就是一条(无关联)。

ii. iterator则可以利用二级缓存,对于一条查询语句,它会先从数据库中找出所有符合条件的记录的ID,再通过ID去缓存找,对于缓存中没有的记录,再构造语句从数据库中查出,因此很容易知道,如果缓存中没有任何符合条件的记录,使用iterator会产生N+1条SQL语句(N为符合条件的记录数)

iii. 通过iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题,如: while(it.hasNext()){

YouObject object = (YouObject)it.next(); session.evict(youObject);

sessionFactory.evice(YouObject.class, youObject.getId()); }

如果用list方法,很可能就出OutofMemory错误了。

iv. 通过上面的说明,我想你应该知道如何去使用这两个方法了。 7、 集合的选用

在HIBERNATE 3.6文档的“21.5理解集合性能”中有详细的说明。 ? ists,maps 和 sets 用于更新效率最高 ? Bag 和 list 是反向集合类中效率最高的 ? 一次性删除(One shot delete)

8、 事务控制

事务方面对性能有影响的主要包括:事务方式的选用,事务隔离级别以及锁的选用

a) 事务方式选用:如果不涉及多个事务管理器事务的话,不需要使用JTA,只有JDBC的事务控制就可以。

b) 事务隔离级别:参见标准的SQL事务隔离级别

c) 锁的选用:悲观锁(一般由具体的事务管理器实现),对于长事务效率低,但安全。乐观锁(一般在应用级别实现),如在HIBERNATE中可以定义VERSION字段,显然,如果有多个应用操作数据,且这些应用不是用同一种乐观锁机制,则乐观锁会失效。因此,针对不同的数据应有不同的策略,同前面许多情况一样,很多时候我们是在效率与安全/准确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解。 9、 批量操作

即使是使用JDBC,在进行大批数据更新时,BATCH与不使用BATCH有效率上也有很大的差别。我们可以通过设置batch_size来让其支持批量操作。 举个例子,要批量删除某表中的对象,如“delete Account”,打出来的语句,会发现HIBERNATE找出了所有ACCOUNT的ID,再进行删除,这主要是为了维护二级缓存,这样效率肯定高不了,在后续的版本中增加了bulk delete/update,但这也无法解决缓存的维护问题。也就是说,由于有了二级缓存的维护问题,HIBERNATE的批量操作效率并不尽如人意!

从前面许多要点可以看出,很多时候我们是在效率与安全/准 确性上找一个平衡点,无论如何,优化都不是一个纯技术的问题,你应该对你的应用和业务特征有足够的了解,一般的,优化方案应在架构设计期就基本确定,否则 可能导致没必要的返工,致使项目延期,而作为架构师和项目经理,还要面对开发人员可能的抱怨,必竟,我们对用户需求更改的控制力不大,但技术/架构风险是应该在初期意识到并制定好相关的对策。

还有一点要注意,应用层的缓存只是锦上添花,永远不要把它当救命稻草,应用的根基(数据库设计,算法,高效的操作语句,恰当API的选择等)才是最重要的。

2.10. 如何解决关联数据延迟加载NoSession问题

? 在确定关联数据是必须时,可以配置 lazy=false 使用立即加载策略 ? 使用OpenSessionInView 模式,在需要数据时,才去加载

? 在程序中,根据业务需要,手动Hibernate.initialize() 手动初始化延迟加载数据

2.11. Hibernate 的 sessionfactory 和 session 的区别是

什么?如何处理 session 线程不安全问题?

sessionfactory 是一个数据源对应着一个 sessionfactory,也就说他是属于二级缓存,如果是 集群环境,他可以动态的配置使用这个数据源或者

不使用这个数据源,session 是等于一次回话,也就是说是一级缓存,并且是由 sessionfactory 创建的,再有 sessionfactory 是线程安全的,相反的 session 不安全的;

解决 session 不安全的问题,就是大家通常用的常规写法,一次会话后关闭 session,避免

session 重用;

2.12. Hibernate 如何实现动态查询?DetachedCriteria

与 Criteria 的区别是什么?

条件查询呗,编程的方式代替 HQL 语句,DetachedCriteria 单词很简明了,Detached 是分离, 分离,分离什么,当然是业务层的应用,原本的Criteria 是与 session 绑定的,现在用DetachedCriteria这个来分离。

3. Spring3 框架题目

3.1. Spring框架的优点

? 方便解耦,简化开发

? Spring就是一个大工厂,可以将所有对象创建和依赖关系维护,交给Spring管理 ? AOP编程的支持

? Spring提供面向切面编程,可以方便的实现对程序进行权限拦截、运行监控等功能 ? 声明式事务的支持

? 只需要通过配置就可以完成对事务的管理,而无需手动编程 ? 方便程序的测试

? Spring对Junit4支持,可以通过注解方便的测试Spring程序 ? 方便集成各种优秀框架

? Spring不排斥各种优秀的开源框架,其内部提供了对各种优秀框架(如:Struts、

Hibernate、MyBatis、Quartz等)的直接支持

? 降低JavaEE API的使用难度

? Spring 对JavaEE开发中非常难用的一些API(JDBC、JavaMail、远程调用等),

都提供了封装,使这些API应用难度大大降低

3.2. 谈谈你理解的IoC和DI

IOC是Inversion of Control的缩写,控制反转,简单来说就是把复杂系统分解成相互合作的对象,借助于“第三方”实现具有依赖关系的对象之间的解耦。 这里的第三方 就是指Ioc容器(Spring 框架),所有对象的创建权,都交由Spring管理。

DI的出现,是对IoC的更近一步分析,既然IOC是控制反转,那么到底是“哪些方面的控

制被反转了呢?经过详细地分析和论证后,他得出了答案:“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。

依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利用依赖关系注入的方式,实现对象之间的解耦。

3.3. Spring中BeanFactory和ApplicationContext 的作用

和区别?

作用:

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.4. Spring 中有几种事务管理?

编程式事务管理,通过TransactionTemplate 实现

声明式事务管理,基于AOP 切面编程实现 ,无需编码,灵活性更高

3.5. Spring 的 Bean作用域

在spring2.0之前bean只有2种作用域即:singleton(单例)、non-singleton(也称 prototype),Spring2.0以后,增加了session、request、global session三种专用于Web应用程序上下文的Bean。因此,默认情况下Spring2.0现在有五种类型的Bean。

1、singleton作用域

当一个bean的作用域设置为singleton,那么Spring IOC容器中只会存在一个共享的bean实例,并且所有对bean的请求,只要id与该bean定义相匹配,则只会返回bean的同一实例。换言之,当把一个bean定义设置为singleton作用域时,Spring IOC容器只会创建该bean定义的唯一实例。这个单一实例会被存储到单例缓存(singleton cache)中,并且所有针对该bean的后续请求和引用都将返回被缓存的对象实例,这里要注意的是singleton作用域和GOF设计模式中的单例是完全不同的,单例设计模式表示一个ClassLoader中只有一个class存在,而这里的singleton则表示一个容器对应一个bean,也就是说当一个bean被标识为

singleton时候,spring的IOC容器中只会存在一个该bean。

2、prototype

prototype作用域部署的bean,每一次请求(将其注入到另一个bean中,或者以程序的方式调用容器的getBean()方法)都会产生一个新的bean实例,相当于一个new的操作,对于prototype作用域的bean,有一点非常重要,那就是Spring不能对一个 prototype bean的整个生命周期负责,容器在初始化、配置、装饰或者是装配完一个prototype实例后,将它交给客户端,随后就对该prototype实例不闻不问了。不管何种作用域,容器都会调用所有对象的初始化生命周期回调方法,而对prototype而言,任何配置好的析构生命周期回调方法都将不会被调用。

3.6. Spring使用属性注入方式

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

setter注入: 一般情况下所有的java bean, 我们都会使用setter方法和getter方法去设置和获取属性的值。

构造方法注入:使用带参数的构造方法

3.7. Spring配置文件applicationContext.xml 能不能改名

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

contextConfigLocation /WEB-INF/itcast.xml

3.8. Spring的声明式事务的如何实现的?

使用内置 TransactionProxyFactoryBean 为目标对象创建AOP代理对象,通过指定TransactionManager 对目标对象的方法添加事务管理操作

3.9. Spring AOP编程原理?项目中如何使用的?

将传统继承的代码复用,变为代码的横向抽取机制,通过 代理机制,向目标对象织入增强代码。

Spring AOP底层基于 Jdk动态代理和Cglib 动态代理 实现

项目中用到的Spring中的切面编程最多的地方:声明式事务管理。 a、定义一个事务管理器

b、配置事务特性(相当于声明通知。一般在业务层的类的一些方法上定义事务) c、配置哪些类的哪些方法需要配置事务(相当于切入点。一般是业务类的方法上)

3.10. Spring提供哪些事务传播行为 ?

PROPAGATION_REQUIRED–支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。

PROPAGATION_SUPPORTS–支持当前事务,如果当前没有事务,就以非事务方式执行。 PROPAGATION_MANDATORY–支持当前事务,如果当前没有事务,就抛出异常。 PROPAGATION_REQUIRES_NEW–新建事务,如果当前存在事务,把当前事务挂起。 PROPAGATION_NOT_SUPPORTED–以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。

PROPAGATION_NEVER–以非事务方式执行,如果当前存在事务,则抛出异常。

PROPAGATION_NESTED–如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则进行与PROPAGATION_REQUIRED类似的操作。

事务传播行为,主要用于解决,两个事务方法互相调用的问题,例如A方法开启事务,调用B方法,B方法也进行事务管理,A方法和B方法的事务是怎样的关系问题。

4. 项目题目

4.1. 你先介绍下你开发的这个项目?

从项目的背景、项目业务进行介绍

4.2. 你负责项目中哪个部分?

4.3. 你负责的这个模块,都实现了哪些功能? 4.4. Xxx功能模块是如何实现的 ?

通常问到这个问题后,就会进入一些技术细节的问题

4.5. 你在项目开发中有没有遇到什么难解决的问题?最终

是如何解决的?

4.6. Xxx技术在项目中是如何应用的? 4.7. JBPM的开发流程

流程设计 ---- 流程定义发布 ---- 流程实例启动 ---- 组任务查询 --- 任务拾取 ---- 个人任务查询 ---- 根据form属性跳转到办理页面 --- 任务办理 --- 流程流转

4.8. 数据库是如何优化的?

4.9. Lucene的存储结构,如何和数据库关联的? 4.10. Hibernate二级缓存在项目中是如何应用的?

PS: 项目这部分,还是有项目的模拟面试老师自己去把控吧,很难写清楚!

4.5. 你在项目开发中有没有遇到什么难解决的问题?最终

是如何解决的?

4.6. Xxx技术在项目中是如何应用的? 4.7. JBPM的开发流程

流程设计 ---- 流程定义发布 ---- 流程实例启动 ---- 组任务查询 --- 任务拾取 ---- 个人任务查询 ---- 根据form属性跳转到办理页面 --- 任务办理 --- 流程流转

4.8. 数据库是如何优化的?

4.9. Lucene的存储结构,如何和数据库关联的? 4.10. Hibernate二级缓存在项目中是如何应用的?

PS: 项目这部分,还是有项目的模拟面试老师自己去把控吧,很难写清楚!

本文来源:https://www.bwwdw.com/article/v0a3.html

Top