常见框架的面试要点

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

  1. 解耦方式

             方法一  通过ActionContext对象来访问

常见框架的面试要点

             方法二   实现接口

常见框架的面试要点

                   优点:解耦,访问方便

                   缺点:只能做取值和设值的操作,不包含其他方法,比如设值session有效时间,获取cookie等方法。

 

  1. 耦合方式

             方法一  通过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上下文对象,值栈里面的内容,过滤器不能。