Java面试准备18

AOP核心概念

(1)切面:类是对物体特征的抽象,切面就是对横切关注点的抽象
(2)横切关注点:对哪些方法进行拦截,拦截后怎么处理,这些关注点称为横切关注点。
(3)连接点:被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器。
(4)切入点:对连接点进行拦截的定义。
(5)通知:指的就是拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕五个类型。
(6)目标对象:代理的目标对象。
(7)织入:将切面应用到代理对象并且导致代理对象创建的过程。
(8)引入:在不修改代码的前提下,引入可以在运行期间为类动态地添加一些方法或者字段。

Spring MVC原理

Spring的模型-视图-控制器框架是围绕一个DispatcherServlet来设计的,这个Servlet会把请求分发给各个处理器,并支持可配置的处理器映射、视图渲染、本地化、时区与主题渲染等,甚至还能支持文件上传。
MVC流程:
(1)客户端请求提价到DispatcherServlet。
(2)由DispatcherServlet控制器查询一个或者多个HandlerMapping,找到处理请求的Controller。
(3)DispatcherServlet将请求提交到Controller。
(4)Controller调用业务逻辑处理后,返回ModelAndView。
(5)DispathcerServlet查询ModelAndView。
(6)处理视图视图映射并且返回模型。
(7)ModelAndView反馈浏览器HTTP。

Spring循环依赖的三种方式

(1)构造器参数循环依赖
Spring容器会将每一个正在创建的Bean标识符放在一个当前创建Bena池中,Bean标识符在创建过程中将一直保持在这个池中。因此如果在创建Bean过程中发现自己已经在当前创建Bean池中里时将抛出BeanCurrentlyInCreationException异常表示循环依赖,而对于创建完毕的Bean将从当前创建Bean池中清除掉。
(2)setter方式单例,默认方式
Spring先是用构造器实例化Bean对象,此时Spring会将这个实例化结束的对象放到一个Map中,并且Spring提供了获取这个未设置属性的实例化对象引用的方法。
(3)setter方式原型,prototype
对于“prototype”作用域Bean,Spring容器无法完成依赖注入,因为“prototype”作用域的Bean,Spring容器不进行缓存,因此无法提前暴露一个创建中的Bean。

什么是IOC/DI?

IoC容器:最主要是完成对象的创建和依赖的管理注入等等。
所谓控制反转,就是把原先我们代码里面需要实现的对象创建、依赖的代码,反转给容器来帮忙实现。那么必然我们就需要创建一个容器,同时需要一种描述来让容器知道对象之间的关系。这个描述最具体的表现就是我们可配置的文件。

SpringMVC的优点

(1)它是基于组件技术的,全部的应用对象,无论控制器和视图,还是业务对象之类的都是Java组件,并且和Spring提供的其他基础结构紧密集成。
(2)不依赖于Servlet API
(3)可以任意使用各种视图技术,而不是仅仅局限于JSP
(4)支持各种请求资源的映射策略
(5)易于扩展

SpringMVC工作原理?

(1)客户端发送请求到DispatcherServlet
(2)DispatcherServlet查询handMapping找到处理对应请求的Controller
(3)Controller调用业务逻辑后,返回ModelAndView
(4)DispatcherMapping查询ModelAndView,找到指定视图
(5)视图将结果返回客户端

Mybatis缓存

Mybatis中有一级缓存和二级缓存,默认情况下一级缓存是开启的,而且不能被关闭。一级缓存指的是SqlSession级别的缓存,当同一个sqlSession中进行相同的SQL语句查询时,第二次的查询不会从数据库查询,而是直接从缓存中获取,一级缓存最多能够存储1024条SQL。二级缓存是指可以跨SqlSession的缓存,是mapper级别的换粗,对于mapper级别的缓存不同的sqlsession是可以共享的。

Mybatis的一级缓存原理(sqlsession级别)

第一次发出一个查询sql,sql查询的结果放入sqlsession的一级缓存之中,缓存使用的数据结构是一个map。
key:MapperID + offset + limit + Sql + 所有的入参
value:用户信息
同一个sqlsession再次发出相同的sql,就从缓存中取出数据。如果两次中间出现commit操作(修改、添加、删除),本sqlsession中的一级缓存区域全部清空,下次再去缓存中查询数据则查不到,从数据库查询再写入缓存。

Mybatis的二级缓存原理(mapper级别)

二级缓存的范围是mapper级别,mapper以命名空间为单位创建缓存数据结构,结构是map。mybatis的二级缓存是通过CacheExector实现的。CacheExecutor其实就是Executor的代理对象。所有的查询操作,在CacheExecutor中都会先匹配缓存是否存在,不存在则查询数据库。

Redis的内存用完了会发生什么

如果达到设置的上限,Redis的写命令会返回错误信息(但是读命令还可以正常返回)。或者可以配置内存淘汰机制,当redis达到内存上限时会冲刷掉旧的内容。

Redis如何做内存优化

可以好好利用Hash、list、sorted set、set等集合类型数据,因为通常情况下很多小的key-value可以用更加紧凑的方式存放到一起,尽可能地使用散列表,散列表使用的内存很小,所以应该尽可能地将数据模型抽象到一个散列表里。

Redis事务支持隔离性吗

Redis是单进程程序,并且它保证在执行事务时,不会对事务进行中断,事务可以运行直到执行完所有事务队列的命令为止。因此,Redis的事务总是带有隔离性。

缓存雪崩

缓存雪崩是指缓存同一时间内大面积的失效,所以,后面的请求都会落在数据库上,造成数据库短时间内内承受大量请求而崩溃。
解决方案:
(1)缓存数据的过期时间设置随机,防止同一时间内大量数据发生过期现象。
(2)使用加锁排队。
(3)给每一个数据增加缓存标记,记录缓存是否失效,如果缓存标记失效,则更新数据缓存。

Redis事务保证原子性吗,支持回滚吗

Redis中,单条命令时原子性执行的,但事务并不保证原子性,且没有回滚。事务中任何命令失败,其余的命令依然会被执行。

缓存穿透

缓存穿透指的是缓存和数据库中都没有的数据,导致所有的请求都落在了数据库上,造成短时间内大量请求导致数据库崩溃。
解决方法:
(1)接口层增加校验,例如用户鉴权校验,id做基础校验,id<=0的直接拦截
(2)从缓存取不到的数据,在数据库中也没有,可以将key-value写为key-null,缓存有效时间设置短一些。
(3)采用布隆过滤器,将所有可能存在的数据哈希到一个足够大的bitmap中,一个不存在的数据就会被拦截掉,从而避免了对底层存储系统的查询压力。

缓存击穿

缓存击穿指的是缓存中没有而数据库中有(一般是缓存时间到期),这是由于并发用户很多,同时去数据库中取数据,引起数据库压力过大。与缓存雪崩不同的是,缓存击穿指的是并发查同一条数据。
解决方法:
(1)设置热点数据永不过期
(2)加互斥锁,互斥锁缓存预热

你可能感兴趣的:(java,面试,servlet)