2018年6月7日星期四
面试 Spring
一、简单介绍一下springMVC
1、它是基于组件技术的.全部的应用对象,无论控制器和视图,还是业务对象之类的都是java组件
2、可以任意使用各种视图技术,而不仅仅局限于JSP
3、支持各种请求资源的映射策略
4、易于扩展
二、SpringMVC的工作流程
1、用户发送请求至前端控制器DispatcherServlet
2、DispatcherServlet收到请求调用HandlerMapping处理器映射器。
3、处理器映射器根据请求url找到具体的处理器,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
4、DispatcherServlet通过HandlerAdapter处理器适配器调用处理器
5、执行处理器(Controller,也叫后端控制器)。
6、Controller执行完成返回ModelAndView
7、HandlerAdapter将controller执行结果ModelAndView返回给DispatcherServlet
8、DispatcherServlet将ModelAndView传给ViewReslover视图解析器
9、ViewReslover解析后返回具体View
10、DispatcherServlet对View进行渲染视图(即将模型数据填充至视图中)。
11、DispatcherServlet响应用户
三、SpringMVC与struts2的区别
1、springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
2、 springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
3、 Struts采用值栈存储请求和响应的数据,springmvc通过参数解析器是a将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。
四、SSM的优缺点
1、MyBatis需要程序员自己编写Sql语句,不过mybatis可以通过XML或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行的结果再映射生成java对象。
2、Mybatis学习门槛低,简单易学,程序员直接编写原生态sql,可严格控制sql执行性能,灵活度高,非常适合对关系数据模型要求不高的软件开发,例如互联网软件、企业运营类软件等,因为这类软件需求变化频繁,一但需求变化要求成果输出迅速。但是灵活的前提是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
3、Hibernate对象/关系映射能力强,数据库无关性好,对于关系模型要求高的软件(例如需求固定的定制化软件)如果用hibernate开发可以节省很多代码,提高效率。但是Hibernate的学习门槛高,要精通门槛更高,而且怎么设计O/R映射,在性能和对象模型之间如何权衡,以及怎样用好Hibernate需要具有很强的经验和能力才行。
五、简单介绍一下你对Mybatis的理解
1、SqlMapConfig.xml,此文件作为mybatis的全局配置文件,配置了mybatis的运行环境等信息。
2、mapper.xml文件即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
3、通过mybatis环境等配置信息构造SqlSessionFactory即会话工厂
4、 由会话工厂创建sqlSession即会话,操作数据库需要通过sqlSession进行
5、 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器、一个是缓存执行器。
6、 Mapped Statement也是mybatis一个底层封装对象,它包装了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement对象,sql的id即是Mapped statement的id。
7、Mapped Statement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql前将输入的java对象映射至sql中,输入参数映射就是jdbc编程中对preparedStatement设置参数。
8、Mapped Statement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过Mapped Statement在执行sql后将输出结果映射至java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程。
六、Hibernate的优缺点
优点:1、对象/关系数据库映射(ORM)
它使用时只需要操纵对象,使开发更对象化,抛弃了数据库中心的思想,完全的面向对象思想
2、透明持久化(persistent)
带有持久化状态的、具有业务功能的单线程对象,此对象生存期很短。这些对象可能是普通的JavaBeans/POJO,这个对象没有实现第三方框架或者接口,唯一特殊的是他们正与(仅仅一个)Session相关联。一旦这个Session被关闭,这些对象就会脱离持久化状态,这样就可被应用程序的任何层自由使用。(例如,用作跟表示层打交道的数据传输对象。)
3、事务Transaction(org.hibernate.Transaction)
应用程序用来指定原子操作单元范围的对象,它是单线程的,生命周期很短。它通过抽象将应用从底层具体的JDBC、JTA以及CORBA事务隔离开。某些情况下,一个Session之内可
能包含多个Transaction对象。尽管是否使用该对象是可选的,但无论是使用底层的API还是使用Transaction对象,事务边界的开启与关闭是必不可少的。
4、 它没有侵入性,即所谓的轻量级框架
5、移植性会很好
6、缓存机制,提供一级缓存和二级缓存
7、简洁的HQL编程
缺点:1、Hibernate在批量数据处理时有弱势
2、针对单一对象简单的增删查改,适合于Hibernate,而对于批量的修改,删除,不适合用Hibernate,这也是OR框架的弱点;要使用数据库的特定优化机制的时候,不适合用
3、优化策略应用不当会导致大量的资源消耗.
七、简单介绍一下对hibernate的理解
hibernate框架是一个ORM的持久层框架,ORM的含义是对象关系映射,简单理解就是通过对象和关系型数据库之间建立映射信息,以后再操作对象就相当于操作数据库了。hibernate框架是对JDBC进行了轻量级的封装,可以更方便简单的对数据库完成增删改查的操作。同时也提供了查询的方式和查询的策略。例如HQL和QBC的查询方式等。还提供了缓存的策略,效率会更高。
八、Hibernate和mybatis的区别
1)mybatis是把sql语句与java代码分离了,sql语句在xml文件配置的
2)hibernate是ORM框架,它对jdbc进行了封装,在分层结构中处于持久化层,它能建立面向对象的域模型和关系数据模型之间的映射.它大大简化了dao层的编码工作
3) mybatis是半自动的,hibernate是全自动的,就是说mybatis可以配置sql语句,对于sql调优来说是比较好的,hibernate会自动生成所有的sql语句,调优不方便,hibernate用起来难度要大于mybatis
九、谈谈Spring的IOC和AOP
IOC:Inversion of Control 控制反转。
我们以前开发,在一个类中使用其他类对象的时候都是采用new的方式直接获取,或者高级一点是通过反射的方式的得到需要的对象实例。这就造成了程序的耦合度非常高,一个类的运行,严重依赖于其他的类。并且还会出现程序中硬编码的情况。
而spring中的IoC很好的解决了该问题,我们在一个类中使用其他类对象时,只需要定义一个接口类型的类成员变量,由使用者在使用时为我们注入具体的实现类对象,从而降低了程序的耦合度。
实现IoC的思想就只有两种:依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。
而依赖注入使用的更广泛一些。例如:构造函数注入,set方法注入等等。
AOP: Aspect Oriented Programming 面向切面编程。
我们之前学习的java语言,号称是面向对象编程,它有自己的优势。但是也存在着一些弊端。
举例说明,在实际开发中,我们都会有一根业务主线,即客户(甲方)的需求。而程序员要做的就是围绕业务主线上的需求,实现功能(实现功能的方法我们叫做业务核心方法)。但是不可避免的,会有一些功能与业务主线没有关系,却又不能不做,比如权限的控制,事务的控制,日志的记录等等,这些功能绝大多数时候和业务主线没有关系,但是却和很多业务核心方法交织在一起,使我们的开发变得麻烦,并且冗余代码增多。
而spring的提供了一种思想,把这些和业务主线没有关系的功能剥离出来,而在需要使用这些公共方法时,适时适地的把它加到我们的代码中去,使程序员在开发时,把更多的精力放在理解需求,实现业务核心功能上,并且让我们的代码变得简洁。这种思想就是面向切面编程。
Spring实现面向切面编程使用的是动态代理技术,并且会根据实际情况来选择使用基于子类的还是基于接口的动态代理。
十、spring和hibernate管理事务有啥区别
1、从编码上说,hibernate的事务管理是硬编码,是写在程序之中的。这就造成了,如果需要调整,就要修改源码,重新编译。
2、从事务控制的位置来说: hibernate是持久层框架,事务是控制在持久层的,这样就造成了越权操作。事务应放在业务层,而非持久层
3、从代码维护上来说:hibernate控制事务,需要在每个需要事务支持的地方编写代码,后期维护不便。
十一、spring管理事务有几种方式
两种:编程式事务:在代码中硬编码
声明式事务:在配置文件中配置
声明式事务又分为两种:基于XML的声明式事务;基于注解的声明式事务