关于框架的面试题

1.Controller是不是单例?为什么这么设计?

默认是单例的,单例对象接受请求访问的时候是线程安全的,而且不用重复创建,性能高;

2.Spring两大特性的了解?如何应用到业务场景中?

       Spring的核心特性就是IOC和AOP,IOC(Inversion of Control),即“控制反转”;AOP(Aspect-OrientedProgramming),即“面向切面编程”;
       IoC(控制反转)是Spring的一个容器,它不是一种技术,而是一种思想,依旧是基于面向对象编程的。它能指导我们怎么样设计出松耦合、更优良的程序;
简单来说,如果现在有两个(甚至更多)类,A类和B类,A类要引用B类中的某个方法,传统编程是在A类中实例化一个B类,也就是通过new,然后调方法,而我们知道,代码高耦合最大的原因就是用了new。利用Spring框架就将实例化的过程交给了IoC容器,通过配置文件中的设置Bean或者B类中添加注解,A类可以直接通过ApplicationContext的getBean方法得到实例,然后打点调用方法就可以了,减少了两个类之间的耦合度
       IoC三种注入方式:(1)接口注入(2)构造方法注入。时效性好,但是灵活性差。(3)赋值方式注入。时效性差,但是灵活性好,需要有set方法。
       AOP(面向接口编程),同样的,他也是一种思想,而不是技术。和OOP(面向对象编程)相比较,AOP是对OOP的补充。OOP是静态的抽象,而AOP是动态的抽象。关于AOP的概念,简单来说就是将一个工程中与源代码无关,但是很多地方都要用,抽出来也不影响源代码上下文的那一部分代码抽出来,然后要用的时候就织入进去,进行使用,至于是在指定的代码之前使用还是之后又或者异常使用等,可以动态的进行;
具体业务场景的使用:
       IOC通过以下注入方式应用到具体业务中, (1)接口注入(2)构造方法注入。时效性好,但是灵活性差。(3)赋值方式注入,时效性差,但是灵活性好,需要有set方法。在应用开发中,当我们在设计组件时,往往需要引入和调用其他组件的服务时,这种依赖关系如果固化在组件设计中就会导致组件之间的耦合和维护难度的增大,这个时候如果使用 IoC 容器,把资源获取的方式反转,让 IoC 容器主动管理这些依赖关系,将依赖关系注入到组件中,那么这些依赖关系的适配和管理就会更加灵活。
       AOP主要使用在如在应用场景: 记录日志; 监控方法运行时间 (监控性能) ; 权限控制 ; 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 ); 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 );

3.有没有用过aop?aop的特性有哪些? 有什么应用?用到的业务的场景是怎样的

       有,AOP(面向接口编程) 是基于动态代理实现的;和OOP(面向对象编程)相比较,AOP是对OOP的补充。OOP是静态的抽象,而AOP是动态的抽象。关于AOP的概念,简单来说就是将一个工程中与源代码无关,但是很多地方都要用,抽出来也不影响源代码上下文的那一部分代码抽出来,然后要用的时候就织入进去,进行使用,至于是在指定的代码之前使用还是之后又或者异常使用等,可以动态的进行;
       应用:例如,在很多业务中都需要记录操作日志,结果我们不得不在业务流程中嵌入大量的日志记录代码。无论是对业务代码还是对日志记录代码来说,维护都是相当复杂的。由于系统中嵌入了这种大量的与业务无关的其他重复性代码,系统的复杂性、代码的重复性增加了。维护起来会更加复杂。
       应用场景: 记录日志; 监控方法运行时间 (监控性能) ; 权限控制 ; 缓存优化 (第一次调用查询数据库,将查询结果放入内存对象, 第二次调用, 直接从内存对象返回,不需要查询数据库 ); 事务管理 (调用方法前开启事务, 调用方法后提交关闭事务 )

4.spring动态代理的方法有几种?它们之间有什么区别

有两种方式:
JDK动态代理,基于接口(默认代理模式),CGLIB动态代理(若要使用需要进行配置);
区别:
jdk的代理对象与被代理对象实现了同一接口,底层通过clone()方法,将实现类的方法复制过来在按照invoke中的配置对方法进行增强。而cglib代理则是代理对象继承了被代理对象的方法,然后自身进行增强。这两种代理思想在外来的自动生成代码方向会经常被使用,实现完全体代码的复用性
两种方式的对比和选择如下:
若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
优点:因为有接口,所以使系统更加松耦合
缺点:为每一个目标类创建接口
若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好

5.请谈谈你对mybatis的缓存的理解

mybatis的缓存分为一级缓存和二级缓存,一级缓存放在session里面,它是默认就有的,二级缓存放在它的命名空间里,默认是打开的,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态),可在它的映射文件中配置<cache/>

6.springmvc的原理

原理分析如下:
01、用户发送出请求到前端控制器DispatcherServlet
02、DispatcherServlet收到请求调用HandlerMapping(处理器映射器)
03、HandlerMapping找到具体的处理器(可查找xml配置或注解配置)生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet
05、HandlerAdapter经过适配调用具体的处理器(Handler/Controller)
06、Controller执行完成返回ModelAndView对象
07、HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
08、DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)
09、ViewReslover解析后返回具体View(视图)
10、DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)
11、DispatcherServlet响应用户

7.了解mybatis的半ORM的原理吗(怎么在一个mapper里面转化成sql去执行)?原理:

加载配置:配置来源于两个地方,一是配置文件,一是Java代码的注解,将SQL的配置信息加载成为一个个MappedStatement对象(包括了传入参数映射配置、执行的SQL语句、结果映射配置),存储在内存中。 SQL解析:当API接口层接收到调用请求时,会接收到传入SQL的ID和传入对象(可以是Map、JavaBean或者基本数据类型),Mybatis会根据SQL的ID找到对应的MappedStatement,然后根据传入参数对象对MappedStatement进行解析,解析后可以得到最终要执行的SQL语句和参数。 SQL执行:将最终得到的SQL和参数拿到数据库进行执行,得到操作数据库的结果。 结果映射:将操作数据库的结果按照映射的配置进行转换,可以转换成HashMap、JavaBean或者基本数据类型,并将最终结果返回。

8.MVC架构模式

MVC设计模式的任务是将包含业务数据的模块与显示模块的视图解耦。在模型和视图之间引入重定向层可以解决问题。此重定向层是控制器,控制器将接收请求,执行更新模型的操作,然后通知视图关于模型更改的消息
具体分析如下:
MVC: Model View Controller 模型-视图-控制器
视图:用户看到并与之交互的界面。
模型:表示企业数据和业务规则。在MVC的3个部件中,模型拥有最多的处理任务。被模型返回的数据是独立的,与数据格式无关。这样的一个模型能够为多个视图提供数据,这样一来模型的代码只需要写一次便能够被多个视图重用,减少了代码的重复性。
控制器:接受用户的输入并调用相应的模型和视图来完成用户的需求,所以当用户点击web页面中的超链接和发送表单时,控制器本身不输出任何东西和做任何处理。它只是接收请求并根据请求来调用哪个模型去处理请求,然后在决定用哪个视图来显示返回的数据。

9.spring底层都用过哪些设计模式?

1、简单工厂,又叫做静态工厂方法(StaticFactory Method)模式, 简单工厂模式的实质是由一个工厂类根据传入的参数,动态决定应该创建哪一个产品类
2、工厂方法(Factory Method),定义一个用于创建对象的接口,让子类决定实例化哪一个类, Spring中的FactoryBean就是典型的工厂方法模式
4、单例(Singleton)模式,保证一个类仅有一个实例,并提供一个访问它的全局访问点,对于哪些使用频繁的对象,可以省略创建对象所用的时间,减少系统开销,降低内存的使用频率,减轻 GC 压力,缩短 GC 停顿时间。
5、适配器(Adapter)模式,将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类可以一起工作,其别名为包装器(Wrapper)。
6、装饰者(Decorator)模式,动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。
7、代理(Proxy)模式,为其他对象提供一种代理以控制对这个对象的访问,
从结构上来看和Decorator模式类似,但Proxy是控制,更像是一种对功能的限制,而Decorator是增加职责, Spring的Proxy模式在aop中有体现,比如JdkDynamicAopProxy和Cglib2AopProxy。
8、观察者(Observer)模式,它是一种对象行为型模式。它表示的是一种对象与对象之间具有依赖关系。定义对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并被自动更新
9、 策略(Strategy),定义一系列的算法,把它们一个个封装起来,并且使它们可相互替换。本模式使得算法可独立于使用它的客户而变化。
10、模板方法(Template Method),定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。Template Method使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
11、另外还有命令模式,职责链模式,抽象工厂模式。

10.热部署怎么用?

通过JRebel插件的方式来进行热部署.
1、在IDEA中打开插件管理界面,正确安装JRebel插件,
2、安装完插件后,需要去获取正版的激活码
3、重启IDEA后,在IDEA的Settings中找到JRebel输入复制的激活码即可
4、 在左边工具栏中勾中JRebel方式后启动即可

11.mybatis的#和$的区别?

都是取值符号,#{}是预编译处理,KaTeX parse error: Expected 'EOF', got '#' at position 14: {}是字符替换。 在使用 #̲{}时,MyBatis 会将 …有SQL注入的问题,但是如果是在order by或者group by 后面添加的一些字符串, 我们需要使用$而不是# 完成字符串的替换

12.springmvc的整体流程

1.springmvc的所有请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责对请求进行真正的处理工作。
2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.
3.DispatcherServlet请求提交到目标Controller
4.Controller进行业务逻辑处理后,会返回一个ModelAndView
5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象
6.视图对象负责渲染返回给客户端。

13.mybatis的作用

MyBatis是一个支持普通SQL查询,存储过程和高级映射的持久层框架。它消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。

14.Ajax原理

Ajax的原理简单来说通过XmlHttpRequest对象来向服务器发异步请求,从服务器获得数据,然后用javascript来操作DOM而更新页面。这其中最关键的一步就是从服务器获得请求数据。
缺点 :ajax干掉了back按钮 安全问题 对搜索引擎支持比较弱。破坏了程序的异常机制

15.mybatis的包扫描怎么变成具体的实现类?

答:mybatis通过JDK的动态代理方式,在启动加载配置文件时,根据配置mapper的xml去生成具体的实现类.
细节如下:

  1. 启动时加载解析mapper的xml
    如果不是集成spring的,会去读取<mappers>节点,去加载mapper的xml配置.
    如果是集成spring的,会去读spring的sqlSessionFactory的xml配置中的mapperLocations,然后去解析mapper的xml;
  2. 绑定namespace(XMLMapperBuilder)
    这里先去判断该namespace能不能找到对应的class,若可以则调用
    configuration.addMapoer(boundType), configuration又委托给MapperRegistry:
  3. 生成该mapper的代理工厂(MapperRegistry)
  4. getMapper的时候生成mapper代理类
  5. new出来MapperProxy
    6.MapperProxy实现InvocationHandler接口进行拦截代理,
    这里的代理拦截,主要是寻找到MapperMethod,通过它去执行SQL
  6. MapperMethod委托给SqlSession去执行sql

16.请阐述spring的事务隔离级别

默认值为 ISOLATION_DEFAULT(使用数据库的设置),其他四个隔离级别和数据库的隔离级别一致:
ISOLATION_DEFAULT:用底层数据库的设置隔离级别,数据库设置的是什么我就用什么,是后端数据库的默认隔离级别;

ISOLATIONREADUNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读);

ISOLATIONREADCOMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读),SQL server 的默认级别;

ISOLATIONREPEATABLEREAD:可重复读,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读),MySQL 的默认级别;

ISOLATION_SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。

17.请阐述你对spring的IOC和DI的理解

比如A对象需要使用合作对象B, 那么A就对B产生了依赖,也就是A和B之间存在一种耦合关系,并且是紧密耦合在一起。
但是这种高度的耦合性在使用了Spring之后就不一样了,创建合作对象B的工作是由Spring来做的,Spring创建好B对象,然后存储到一个容器里面,当A对象需要使用B对象时,Spring就从存放对象的那个容器里面取出A要使用的那个B对象,然后交给A对象使用,至于Spring是如何创建那个对象,以及什么时候创建好对象的,A对象不需要关心这些细节问题,A得到Spring给我们的对象之后,两个人一起协作完成要完成的工作即可。
所以控制反转IoC(Inversion of Control)是说创建对象的控制权进行转移,以前创建对象的主动权和创建时机是由自己把控的,而现在这种权力转移到第三方,比如转移交给了IoC容器,它就是一个专门用来创建对象的工厂,你要什么对象,它就给你什么对象,有了 IoC容器,依赖关系就变了,原先的依赖关系就没了,它们都依赖IoC容器了,通过IoC容器来建立它们之间的关系。
DI(依赖注入)其实就是IOC的一种类型, IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(Dependency Injection,依赖注入)来实现的

18.使用过分页插件么?

使用过MyBatis 分页插件 - PageHelper
该插件目前支持Mysql, Oracle数据库的物理分页:
使用步骤:
1在maven pom.xml中添加依赖
2在Mybatis-config.xml中sqlSessionFactory中添加插件配置
3.写sql、service
分页插件的原理:实现Mybatis提供的接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql。
举例:select * from student,拦截sql后重写为:select t.* from (select * from student) t limit 0,10

19.mybatis的底层原理是什么?

1 Mybatis配置:sqlmapConfig.xml,此文件作为Mybatis的全局配置文件,配置了Mybatis的运行环境等信息。mapper.xml即sql映射文件,文件中配置了操作数据库的sql语句。此文件需要在SqlMapConfig.xml中加载。
2通过Mybatis环境等配置信息获得sqlsessionfactory即会话工厂
3 由会话工厂创建sqlsession即会话,操作数据库需要通过sqlsession进行。
4 mybatis底层自定义了Executor执行器接口操作数据库,Executor接口有两个实现,一个是基本执行器,一个是缓存执行器。
5 Mapped Statement也是mybatis一个底层封装对象,它保障了mybatis配置信息及sql映射信息等。mapper.xml文件中一个sql对应一个Mapped Statement独享,sql的id就是mapped statement的id。
6 Mapped Statement对sql执行输入参数定义,包括Hashmap、基本类型、pojo、Executor通过Mapped Statement在执行sql前将输入的java对象映射到sql中,输入参数映射就是jdbc编程中对prepared Statement设置参数。
7 Mapped Statement对sql执行输出结果进行定义,包括Hashmap、基本类型、pojo、Executor通过Mapped Statement在执行sql后将输出结果映射到java对象中,输出结果映射过程相当于jdbc编程中对结果的解析处理过程

发布了18 篇原创文章 · 获赞 1 · 访问量 415

猜你喜欢

转载自blog.csdn.net/weixin_43714592/article/details/104132103