常见框架的面试要点
1 hibernate
概念:
它是O/R Mapping框架(对象关系映射框架)与之类型的框架有JPA,Mybatis框架。它提供丰富的查询(HQL查询,SQL查询,离线查询,命名查询(与mybatis类似,将查询语句写在实体类映射文件中))和对表的操作。
JDBC和Hibernate区别
相同点:1 都是操作数据库的中间件
2 操作的对象都不是线程安全
3 都要进行显示事务处理
不同点: 1 操作语言不同,JDBC只能写纯sql,Hibernate可以是HQL或者是SQL
2 操作的语句对象不同,JDBC操作的是表和表字段,Hibernate的HQL操作的实体类和其属性
3 操作的对象状态不同,jdbc基本都是瞬时状态的数据,hibernate操作的数据对象可以瞬时,持久和游离中的一种。
Hibernate对象三种状态以及如何切换?
瞬时:一般指new出来的数据,数据库没有数据与之相对应
持久:数据库有数据与之相对应,且当前的session没有关闭,如果修改了这个对象的值就有可能影响数据库表中的值
游离(脱管):数据库有数据与之相对应,但是当前session已经关闭。
瞬时转持久?------》调用save(瞬时对象)或者saveorupdate(瞬时对象)方法
持久转瞬时?-----》调用delete(持久对象)
持久转游离?----》调用session.close()或者session.clear()方法
游离转持久?---》sessionFactory.openSession()方法
不能直接将瞬时转游离状态。
Hibernate中session的get方法和load方法的区别?
1 当查询不到数据时,get会返回null,load会抛出异常
2 get方法获取的数据都是真实数据(包括外键对象都是真实数据),load方法获取的数据如果有外键对象,那么该对象就是代理对象(代理对象默认是没有数据,如果向让代理对象获取数据,可以通过Hibernate.initialize(代理对象)方法)。
Hibernate主键生成策略
1 native 本地化,根据当前配置数据库的类型做出适应的匹配
2 increment 添加记录前,查询当前表最大id值,再+1后作为这条添加的记录的id
3 sequence 适用于不支持主键自增,但是支持序列自增的数据库(oracle,DB2)
4 identity 适用于支持主键自增,比如mysql,sqlServer ,sqlite
5 assigned 字符串类型的主键,需要程序员自己添加。
6 uuid.hex 按照算法生成的128位逻辑主键,该主键在当前世界是唯一。
Hibernate级联和懒加载
级联:与增删改。如果需要通过修改一张表的数据影响另一张表的数据,建议使用级联。使用级联要注意删除时候,有可能会误删掉外键关联的其他数据,删除之前是否使用级联要慎重。
懒加载:与查询数据有关。希望通过查询一个实体数据时,取出对应的实体外键对象的数据,应该配置lazy=“false”,如果没有这样的配置会导致no session 异常,原因是在配置了懒加载关系的时候,系统取出的外键对象并不是真实对象,而是代理对象,代理对象默认是不包含具体属性的值的。
Hibernate 一级缓存和二级缓存
1 一级缓存:session级缓存,在session没有关闭的情况下,默认对hql查询进行缓存。默认开启
2 二级缓存:sessionFactory,需要手工配置。
使用缓存场景和注意事项:
1 如果表查询的频率远大与增删改的频率,那么可以设置缓存
2 设置缓存自动清除时间,以免过多读取的脏数据。
Fetch属性 select和join的区别
如果查询需要大量的外键字段(to many)的数据,那么建议使用join,因为join方式采用连表查询,select分开的独立查询,效率join比较高。
2 Spring
IOC:控制反转,程序本身不负责依赖对象的创建和维护,其创建和维护交给外部容器spring负责,这样的控制权的转移就叫做控制反转
优点:1 降低项目的耦合度
2 简化程序开发
依赖注入:运行期,依赖对象的实例,依赖对象的内部的属性值由外部容器spring读取相应的配置信息后注入。
自动包扫描各层的注解:
@Controller 用于注解控制层
@Service用于注册业务逻辑层(bizimpl或者service)
@Repository用于注解Dao层(daoimpl)
@Component用于其他层。
依赖对象注入采用@Resouce或者@Autowire这两种。
Spring Bean注入有几种scope:
1 singleton 单例(默认) bean的所有对象都是同一个对象,适合于无状态的对象(dao层,biz层,controller层)
2 prototype 原型,bean的所有对象都是new出来对象,适合有状态的对象(entity层)
3 request
4 session
5 global-session
AOP:
- AOP:面向切面的编程思维,AOP能够将那些与业务无关,却为业务模块所共同调用的逻辑或责任,例如事务处理、日志管理、权限控制等,封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。
- AOP能干什么,也是AOP带来的好处
1:降低模块的耦合度
2:使系统容易扩展
3:更好的代码复用性
AOP各种通知的执行顺序:
正常执行顺序:
环绕通知---前置通知---切入点切入的方法---最终通知---后置通知
环绕通知不允许方法执行:环绕通知---最终通知
切入点切入的方法发生异常:
环绕通知---前置通知---切入点切入的方法在异常发生之前的代码---最终通知
3 mybatis
概念:
O/R mapping持久层框架,Mybatis只能sql语句做数据库的CRUD操作,也可以调用存储过程等高级编程方式
Mybatis采用xml或者注解实现相应的配置和映射,将dao接口和java pojo映射成数据库的记录。
MyBatis和Hibernate区别
相同点: 1 操作数据库的中间件
2 都有一级二级缓存
3 都支持JTA事务处理
不同点: 1 mybatis只能写sql语句,但是可以写动态sql,Hibernate可以写sql或者hql,但是不支持动态sql。
2 操作的对象状态不同,mybatis基本都是瞬时状态的数据,hibernate操作的数据对象可以瞬时,持久和游离中的一种。
3 mybatis易上手,只能手工建表,Hibernate学习难度较高,自动建表。
Mybatis缓存
一级缓存:session级缓存
二级缓存:Mapping级缓存,需要手工配置。
使用缓存场景和注意事项:
1 如果表查询的频率远大与增删改的频率,那么可以设置缓存
2 设置缓存自动清除时间,以免过多读取的脏数据
4 SpringMVC
概念:
最彻底的MVC框架,轻量级web框架(类似的mvc框架有JSF,Jfinal,Struts2,Struts1等等),基于请求驱动类型,能够简化我们的开发。
SpringMVC和Struts2区别
1 springMVC的入口一个serlvet,Struts2的入口的是fillter
2 SpringMVC是方法级别的拦截,Struts2是类级别的拦截。
3 ajax使用上,SpringMVC可以采用@responseBody实现无返回的请求方法,Struts2 使用则比较麻烦。
4 方法返回值类型,SpringMVC 可以是String ,Model,ModelAndView ,Void等丰富的类型,Struts2只能是String类型。
SpringMVC数据流程
springmvc的工作流程
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet调用HandlerAdapter处理器适配器
5、HandlerAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
RESTful风格的优势是什么
(1)每一个URI代表一种资源,独一无二;
(2)客户端和服务器之间,传递这种资源的某种表现层;
(3)客户端通过四个HTTP动词,对服务器端资源进行操作,实现"表现层状态转化"。
值得注意的是RESTful风格的RUI中是不包含动词的。
5 Struts2
基本概念:
MVC框架,提供了大量丰富的功能,拦截器,国际化,转换器,校验器,标签库(s标签)等功能,与其他的框架兼容性较好。
优点:简化项目开发,有利于MVC各层的解耦,提供了丰富的功能。
Struts2数据流程
1 当用户发送请求时,进入Struts2的核心过滤器(StrutsPrepareAndExecuteFilter)
2 核心过滤器中的ActionMapper去Struts.xml中查找是否有对应请求action(action请求的查找方式?),如果有,请求要经过一些列拦截器后进入该action。通过action代理对象(actionProxy)操作action(Struts2每次请求都会创建一个action,是线程安全)
3 根据Struts.xml配置result中name匹配方法的返回值,如果返回值一致,则通过配置跳转方式(默认dispatcher,此外还有redirect,chain,redirectaction,stream)进行跳转。在跳转之前,还需要反穿越一系列拦截器,最后解析响应给客户端。
Struts2数据接受三种方式
1 action属性直接接受
2 领域对象
3 领域模型
Struts2 访问request,session ,application
- 解耦方式
方法一 通过ActionContext对象来访问
方法二 实现接口
优点:解耦,访问方便
缺点:只能做取值和设值的操作,不包含其他方法,比如设值session有效时间,获取cookie等方法。
- 耦合方式
方法一 通过ServletActionContext对象
方法二 实现接口
优点:不仅可以设值和取值,也可以有其他serlvet 内置对象常用的方法
缺点:不解耦
Struts2 action搜索顺序
http://localhost:8080/StrutsDemo/path1/path2/path3/test.action
1 查找命名空间path1/path2/path3下面name叫test的action
2 如果没有,则查找命名空间是path1/path2/下面name叫test的action
3 如果没有,则查找命名空间是path1下面name叫test的action
4 如果没有,则查找命名空间是””下面的name叫test的action
5 如果还没有,则跳转到404页面。
Struts.xml文件默认配置
如果没有配置action节点中class属性值,默认是ActionSupport
如果没有配置action节点中method属性值,默认是execute
如果没有配置result节点中name属性值,默认是success
如果没有配置result节点中type属性值,默认是dispatcher
拦截器和过滤器的区别
1 过滤器只过滤请求,包含http请求或者action请求或者url请求,拦截器一般只用来拦截action请求
2 一次有效的action请求中,拦截器要执行两次,过滤器只执行一次
3 拦截器是基于java的反射机制实现,过滤器是基于函数回调机制实现。
4 拦截器可以访问action上下文对象,值栈里面的内容,过滤器不能。