1.Spring Mvc 工作原理
- 用户向服务器发出请求,请求被前端控制器DispatchServlet捕获
- DispatherServlet对请求URL进行解析,然后调用HandlerMappring,将请求映射到处理器HadlerExecutionChain
- DispatherServlet根据获得Handler,选择一个合适的HandlerAdapter,
- Handler对数据处理完之后,返回一个ModelAndView()给DispterServlet
- Handler返回的ModelAndView()只是一个逻辑视图,并不是一个真正的视图,DispatherServlet通过ViewResolver视图解析器获得一个真正的视图返回给DispatherServlet
- DespthcherServlet通过model解析出ModelAndView()的参数进行渲染,然后把视图返回给客户端
- @ResponseBody 和 @RequestBody的区别
@ResponseBody 用于方法上,将返回结果转为json数据写入HTTP response body z中
@RequestBody 是将Http请求参数封装到JavaBean中
- SpringMVC如何获取客户端IP地址
request.getRemoteAddr();
- GET和Post的区别
get:参数url中可见 post url中不可见;get 通过拼接url进行传递 post通过body传递
get 请求可以缓存数据 post不可以缓存数据;get 请求页面后退是,不产生影响,post后退会重写提交请求;get传送数据是2kb
- AOP是靠什么来实现的
动态代理 程序调用的不是目标类而是代理类,代理类与目标类对外具有相同的方法声明,有两种可以实现相同的方法声明,一个是实现相同的接口,二是作为目标的子类
jdk中采用proxy类参数动态代理的方式为某个接口产生实现类。如果为某个类产生子类就用CGLIB
- 有数据库优化的经历吗?
查找定位慢查询,并优化;创建索引;分表;读写分离;使用redis进行缓存
- 多线程使用过吗?
使用多线程发送邮件
- 二叉树的遍历方式
- 线程池有哪些?分别是什么?
好处:减少创建和销毁的次数,每个线程都可以重复利用
线程池
- mybatis配置mapper文件的方式?
mapper文件
配置Mapper的具体路径;扫描包配置Mapper路径
- join,where,groupby,orderby的执行顺序?
form join on where group by having select order by
- resultType和resultMap的区别
- HashMap是怎么实现的?
- sychronize和lock的区别?
lock 需要获取锁,释放锁;synchronized自动获取锁和释放锁;线程较多是使用lock性能高,线程少时使用synchronized性能好。
- IOC和DI的区别?
DI: set注入 构造方法注入
- 数据库的索引有哪些?
- 数据库连接池?
限定数据库的个数,不会导致导致数据库连接过多导致系统运行缓慢或者崩溃;数据库连接不用每次都去创建和销毁,减少开销;
数据库连接不用每次都创建增快响应速度
- 为什么需要缓存?常用的第三方缓存有哪些?
访问本地缓存中的数据,要比访问数据库速度快得多,性能要高,为了提高性能使用缓存;Ehcache Gava cache; redis
- object类里有哪些方法?
取得对象信息的方法:toString() 对象相等判断方法:equals() 对象签名:hashCode()
- 常见的缓存淘汰策略有哪些?
LRU: 最近最少使用的,(默认)移除长时间不被使用的对象;
FIFO 先进现出,按照对象进入缓存的时间销毁
- 脏读和幻读?
1.脏读一个事务读取到另一个没有提交的事务2.幻读一个事务读取到另一个已经提交的事务3.不可重复读同一个事务中,多次读取的数据不一样
- 同步和异步有什么区别
同步: 发送一个请求之后要等待其返回结果,才能发送下一个请求;有一个等待过程
异步:发送一个请求后,不需要等待返回结果,就能发送下一个请求;没有等待过程
开发过程中,优先使用异步开发;比如在操作银行存取款,修改数据库的时候使用同步;