1.帮助
框架技术是程序员在面试和实际项目开发过程中用的很多的技术。小编收集归纳了一些大家在面试时经常被问到的有关常用框架问题。也欢迎各位同学给小编发送自己在面试过程中遇到的框架问题。直接在本文结尾处留言即可。在这里感谢曽婷和李纤两个小伙伴收集提供的最新面试题目。小编在本文中整理得了SSH、SSM 5个框架的常问面试问题,最核心的也就是Spring框架问题
目录:
①Struts2面试问题
②Hibernate面试问题
③Spring面试问题
④SpringMVC面试问题
⑤MyBatis面试问题
⑥框架比较面试问题
Struts2面试问题
1.Struts2的工作流程
①. 请求发送给StrutsPrepareAndExecuteFilter
②. StrutsPrepareAndExecuteFilter判定该请求是否是一个Struts2请求
③. 若该请求是一个Struts2请求,则StrutsPrepareAndExecuteFilter把请求的处理交给ActionProxy
④. ActionProxy创建一个ActionInvocation的实例,并进行初始化
⑤. ActionInvocation实例在调用Action的过程前后,涉及到相关拦截器(Intercepter)的调用
⑥. Action执行完毕,ActionInvocation负责根据struts.xml中的配置找到相对应的返回结果,调用结果的execute方法。
⑦. 执行各个拦截器invocation.invoke()之后的代码
⑧. 把结果发送到客户端
2.Struts2优点
①. 基于MVC架构,框架结构清晰
②. 使用OGNL:OGNL可以快速的访问值栈中的数据、调用值栈中对象的方法
③. 拦截器:struts2中的很多特性都是通过拦截器实现的,例如异常处理、文件上传、验证等。拦截器时可配置与重用的
④. 多种表现层技术,如:JSP、FreeMarker、Velocity等
3.Struts2拦截器和过滤器的区别
①. 过滤器依赖于Servlet容器,而拦截器不依赖于Servlet容器
②. Struts2拦截器只能对Action请求起作用,而过滤器则可以对几乎所有的请求起作用
③. 拦截器可以访问Action上下文(ActionContext),而过滤器不行
④. 在Action的生命周期中,拦截器可以多次调用,而过滤器只能在容器初始化时被调用一次
4.谈谈ValueStack
①. ValueStack贯穿整个Action的生命周期,保存在request域中,所以ValueStack和request的生命周期时一样的.
②. ValueStack是多实例的,因为Action是多实例的(Servlet是单例的),每个Action都有一个对应的值栈,Action对象默认保存在栈顶
③. ValueStack本质上就是一个ArrayList
④. 使用OGNL访问值栈内容是,不需要#号,而访问作用域中的值时,需要#号
⑤. Struts2重写了request的getAttribute方法,所以可以用EL直接访问值栈中的内容
Hibernate面试问题
1.Hibernate的工作原理
①. 通过Configuration读取并解析hibernate.cfg.xml配置文件
②. 由hibernate.cfg.xml中的读取并解析映射文件
③. 通过config.buildSessionFactory创建sessionFactory
④. 通过sessionFactory.openSession获取session
⑤. 通过session.beginTransaction开启事务
⑥. 操作数据
⑦. 提交事务
⑧. 关闭session和sessionFactory
2.Hibernate的优缺点
优点:
①. 对JDBC访问数据库的代码进行了封装,简化了数据库访问层繁琐的重复性代码
②. 映射的灵活性,它支持各种关系数据库,从一对一到多对多的各种复杂关系
③. 非侵入性、移植性会好
④. 缓存机制:提供一级缓存和二级缓存
缺点:
①. 无法对SQL进行优化
②. 框架中使用ORM原则,导致配置过于复杂
③. 执行效率和原生的JDBC相比偏差:特别是在批量数据处理的时候
④. 不支持批量修改、删除
3.在Hibernate应用中Java对象的状态有那些
①. 临时状态(新建状态):不处于session缓存中
②. 持久化状态:加入到session缓冲中
③. 游离状态:已经被持久化,但不在session的缓存中
4.Hibernate如何延迟加载
当调用session的load()方法加载实体类时,就会延迟加载
5.Hibernate进行大批量更新的经验
直接通过JDBC API执行相关的SQL语句或者调用相关的存储过程是最佳的方式
6.Hibernate的缓存机制
Hibernate缓存包括两大类:Hibernate一级缓存和Hibernate二级缓存,当hibernate根据ID访问数据对象时,首先会从session一级缓存中查;查不到,如果配置了二级缓存,则从二级缓存中查;如果都查不到,再查询数据库。
①. 一级缓存:又称为”Session级别缓存”,只存在于session的生命周期中,当session关闭时,该session所管理的一级缓存也会被立即清除。该缓存由Hibernate管理,应用程序无须干预
②. 二级缓存:又称为”SessionFactory级别缓存”,存在于整个应用程序中,一个应用程序对应一个SessionFactory。该缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate为查询结果提供了一个查询缓存,它依赖于二级缓存
7.Hibernate中getCurrentSession()和openSession()的区别?
①. getCurrentSession()会先查看当前线程中是否绑定了session,如果有则直接返回,如果没有再创建。而openSession()则直接new一个新的session并返回
②. getCurrentSession在事务提交时会自动关闭session,而openSession()需要手动关闭
8.Hibernate查询方式有哪些
①. QBC标准查询
②. HQL查询(Hibernate query language hibernate查询语言)
③. 本地SQL查询(原生态查询)
9.Hibernate中Load()和get()区别
①. 从返回结果上对比:get方法检索不到结果的话,返回结果为null;但是load()方法检索不到结果的话,则会出现ObjectNotFoundException异常
②. 从检索机制上对比:load支持延迟加载(懒加载),get不支持延迟加载
SpringMVC面试问题
1.SpringMVC的工作流程
①. SpringMVC将所有的请求都提交给DispatcherServlet
②. DispatcherServlet收到请求调用HandlerMapping处理映射器
③. 处理映射器找到具体的处理器,生成处理器对象返回给DispatcherServlet
④. DispatcherServlet调用HandlerAdapter处理器适配器
⑤. HandlerAdapter经过适配调用具体的处理器Controller
⑥. Controller进行业务逻辑处理后,会返回一个ModelAndView
⑦. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
⑧. DispatcherServlet将ModelAndView传给ViewResolver视图解析器
⑨. ViewResolver解析后返回具体的View
⑩. DispatcherServlet根据View进行渲染视图并响应用户
MyBatis面试问题
1.#{}和${}区别是什么
#{}:参数占位符,Mybatis会将sql中的#{}替换 为?
${}:变量占位符,也可以理解为取值符
2.讲一下mybatis的缓存机制
MyBatis提供了查询缓存来缓存数据,以提高查询的性能,MyBatis的缓存分为一级缓存和二级缓存。
一级缓存:SqlSession级别的缓存,基于HashMap本地缓存,当同一个sqlSession执行两次相同的SQL语句时,第一次执行完后会将数据库中查询到的结果写到缓存,第二次查询时直接从缓冲中读取不经过数据库了。一级缓存默认时开启的
二级缓存:mapper级别的缓存,也是基于hashmap本地缓存,不同的sqlSession两次执行相同的namespace下的sql语句,第二次查询就不会进行数据库了。
框架比较面试问题
1.Springmvc与struts2区别
①. SpringMVC的入口是Servlet,而Struts2是Filter
②. SpringMVC会稍微比Struts2快些,SpringMVC是基于方法设计,而Struts2是基于类,每次发一次请求都会实例一个Action
③. SpringMVC使用更加简洁,开发效率SpringMVC比Struts2高,支持JSR303,处理ajax请求更加方便
④. Struts2的OGNL表达式使页面的开发效率相比SpringMVC更高些
2.Hibernate与mybatis区别
开发效率方面:
①. hibernate开发中,sql语句已经被封装,直接可以使用,加快系统开发(但是对于庞大复杂系统项目来说,负责语句较多,hibernate就不是一个很好的方案)
②. Mybatis属于半自动化,sql需要手工完成,稍微繁琐
SQL优化方面
①. Hibernate自动生成SQL,有些语句较为繁琐,会多消耗一些性能
②. MyBatis手动编写SQL,可以避免不需要的查询,提高系统性能
对象管理方面
①. hibernate是完整的ORM框架,开发过程中,无需过多关注底层实现,只需要管理对象即可
②. MyBatis需要自行管理映射关系
3.SSH与SSM有什么区别
SSH指的是:Struts+Spring+hibernate
SSM指的是:Spring+SpringMVC+MyBatis