typora-root-url: ......\Software\Typora\Picture


Bean的作用域

  • 在Spring的元素的scope属性设置bean的作用域,用来决定bean是单实例还是多实例的
  • 默认情况下Spirng为每个在IOC容器里声明的bean创建唯一一个实例,整个IOC都能共享该实例,且所有getBean() 调用和 bean 引用都将返回这个唯一bean实例,该作用域被称为singleton,是所有bean的默认作用域

  • bean的作用域

    • singleton:默认值。当ioc一创建就会创建bean实例,而且是单例,每次得到的都是同一个
    • prototype:原型的。当IOC一创建不再实例化该bean,每次调用getBean再实例化bean,而且每个实例都不同
    • request:每次请求实例化一个bean
    • session:在一次会话中共享一个bean

事务的传播行为

  • 一个方法运行在了一个开启了事务的方法中,当前方法是使用原来的事务还是开启一个新的事务

  • 7种传播行为:

    • REQUIRED:如果有事务在运行,就在这个事务运行,否则启动新的事务并运行
    • REQUERES_NEWS:当前方法启动新事物并运行,如果有事务正在运行就将它挂起
    • SUPPORTS:如果有事务在运行就在这个事务内运行,否则就不运行在事务
    • NOT_SUPPORTED: 不在事务中运行,如果有运行的事务就挂起
    • MANDATORY:当前方法必须运行在事务内部,如果没有事务就抛出异常
    • NEVER: 当前方法不应该运行在事务中,如果有运行的事务就抛出异常
    • NETSTED:如果有事务在运行,当前方法就在这个事务的嵌套事务内运行,否则就启动新事务并运行。

数据库事务并发问题

  • 脏读: 一个事务读取到了另一个事务更新修改但还未提交的值
  • 不可重复读:第一次读和第二次读的数据不一样,原因是这中间有另一个事务修改了数据
  • 幻读:一个事务读取表中的数据,第二次读取该表示多出了几行数据,这中间有另一个事务向表中插入新的行

隔离级别

  • 读未提交:READ UNCOMMITTED:允许事务1读取事务2未提交的数据
  • 读已提交:READ COMMITTED:事务1只能读取到事务2已提交的修改
  • 可重复读:REPEATABLE READ:事务执行期间禁止其他事务对这个字段进行更新,Mysql默认隔离级别
  • 串行化:SERIALIZABLE:确保可以多次从一个表中读取到相同的行

SpringMVC下解决Post和Get请求中文乱码问题

  • 解决Post请求:修改web.xml,注册Filter;设置CharacterEncodingFilter.class里的encoding和forceEncoding

拦截请求

<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
  • 解决Get请求乱码问题

    • 方法1:在server.xml中修改如下配置

      <connector URIEncoding="UTF-8" />

    SpringMVC工作流程

  • 处理模型数据方式一:将方法的返回值设置为ModelAndView

  • 方法的返回值是String,在方法的入参中传入Map、Model或ModelMap,SpringMVC最终转换为一个ModelAndView对象

  • 前台发送请求到中央控制器DispatchServlet,后者调用处理器映射器HandlerMapping处理得到拦截器HandlerExecutionChain(包含所有拦截器和处理器)返回给DispatchServlet
  • DispatcherServlet通过处理器适配器HandlerAdapter调用相应的处理器Handler(即Controller)处理请求后返回ModelAndView给DispatcherServlet
  • DispatcharServlet通过视图解析器(InternalResource)ViewResolver对ModelAndView进行视图解析后得到视图view
  • 最后DispatcharServlet调用view里的render方法来渲染视图,响应给客户端

SpringMVC源码Debug过程(分析DispatcherServlet.class)

  • 涉及的类:DispatcherServlet|View|AbstractView|InternalResourceView

  • 945:DispatcherServlet.doDispatch(HttpServletRequest, HttpServletResponse) // 执行转发调度

  • 916\1101:mappedHandler = getHandler(processedRequest); // 通过处理器映射器HandlerMapping得到总处理器对象HandlerExecutionChain(包含所有拦截器和处理器)

  • 923行: HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()) // 通过处理器映射器HandlerMapping处理得到适配器HandlerAdapter

  • 945行:mv = ha.handler(processRequest, response, mappedHandler); // 处理器执行用户的目标方法得到modelAndView

  • 1012行:render(mv, request, response); // 通过视图解析器(InternalResource)ViewResolver解析modelAndView进行视图解析并返回view

  • 1225: view.render(mv.getModelInternal(), request, response); // 渲染视图

    • (AbstractView.class)226行: renderMergedOutputModel(mergedModel, request, response); // 输出模型数据响应给用户
    • InternalResourceView(180行):exposeModelAsRequestAttributes(model, requestToExpose); // 暴露模型数据放到request域中
    • (AbstractView.class)374行:request.setAttribute(modelName, modelValue); // model放到request域中
  • InternalResourceView(189): RequestDispatcher rd = getRequestDispatcher(requestToExpose,dispatcher); // 获取转发器

  • InternalResourceView(189):rd.forward(requestToExpose, response); // 进行请求转发

MyBatis解决:当实体类属性名和数据库表中字段名不一致

    1. 写sql语句时起别名:select last_name lastName from S // 在数据库表字段不分大小写
    1. 在mybatis-config.xml开启驼峰命名规则:

    <setting name="mapUnderscoreToCamelCase" value="true"/>

  • 在Mapper映射文件中使用resultMap来自定义高级映射规则

<resultMap type="/*包名*/" id="myMap">
<id column="last_name" property="lastName"> // 将数据库表字段与属性名一一对应
</resultMap>

centos6/7常用服务命令service/systemctl

  • service/systemctl start/restart/stop/reload/status 服务名

  • 查看服务命令(centos7)

    • systemctl list-unit-files
    • systemctl --type service
  • 查看服务命令(centos6): chkconfig --list|grep xxx

  • (centos7)自启动: systemctl enbale/disable 服务名

    • (centos6)自启动: chkconfig --level 5 服务名 on/off

git分支命令和实际应用

Redis持久化

  • Redis提供两种持久化方式:RDB(Redis Database)和AOF(Append Of File)

  • RDB: 在指定时间间隔内将内存中的数据集快照写入磁盘,恢复时将快照文件读到内存,即全量存储

    • 优点: 节省磁盘空间,恢复速度快
    • 缺点: 在到达指定的存储点之前如果redis挂掉,将丢失上一次快照到存储点之间所有修改。数据量庞大比较消耗性能

  • AOF:以日志的形式记录所有写操作,是增量操作,只追加文件,不修改文件

    • 优点:丢失数据概率更低,备份机制稳健,可读的日志文本,通过操作AOF可以处理误操作
    • 缺点:占用更多磁盘空间,恢复速度慢,有更大的性能压力,存在个别bug造成不能恢复

15. Mysql什么时候建索引

  • 频繁作为查询条件的字段应该创建索引

  • 查询中与其他表关联的字段,外键关系建立索引

  • 单键/组合索引的选择问题,组合索引性价比更高

  • 查询中排序的字段,排序字段若通过索引去访问将大大提高排序速度

  • 查询中统计或者分组字段,排序GROUP BY 比 ORDER BY 更烧性能

  • 不要创建索引:

    • 表记录太少,经常增删改的表或字段
    • Where条件里用不到的字段不创建索引,过滤性不好(如性别,结果太多)的不适合建索引

16.JVM垃圾回收机制,GC发生在JVM哪部分,有几种GC,它们的算法是什么?

JVM体系结构:

  • 垃圾回收机制GC发生在堆heap中,

  • GC:分代收集算法,次数上频繁收集Young区(Minor GC),较少收集Old区(Full GC),基本不动Perm区(永久区)

  • 四大算法:

    • 引用计数法:一般不采用。有对象没引用,GC就不进行垃圾回收,每次对对象赋值都要维护引用计数器,较难处理循环引用
    • 复制算法Copying:年轻代Young区使用Minor GC,采用的就是复制算法。从一片内存拷贝到另一片内存空间,因此没有内存碎片,且没有标记和清除过程,效率高,但耗费空间, 需要双倍空间。
    • 标记清除Mark-Sweep:在Old区采用,一般由标记清除或者标记清除与标记整理的混合使用。过程:从根节点开始扫描并对存活的对象进行标记,然后扫描并回收未被标记的对象,使用free-list可以记录区域。缺点:产生内存碎片,耗时。优点:无需额外空间。
    • 标记清除压缩Mark-Sweep-Compact:采用于Old区。先进行一次标记清除的过程,然后再扫描并将存活对象滑动到一端。还可以进行多次CG后才Compact压缩。优点:无内存碎片,但耗费时间.

Redis在项目中的使用场景

  • String: Redis可存放incrby命令所计算出的访问次数,一个IP频繁访问服务器时,可能有风险
  • Hash:存储用户信息:Hget(userKey,id); Hset(userKey,id,102),如果使用Get(userKey),会将所有信息反序列化,需要进行不必要的IO
  • List:实现最新消息的排行,还可以利用List的push() 将任务存放在list中,同时使用pop()将任务取出,redis-list可用于模拟消息队列,常用于电商的秒杀
  • Set:可以自动排重,比如在微博中将每个人的好友存在于集合Set中,这样求两个人的共同好友操作,只需要求交集即可。
  • Zset:以某一个条件为权重进行排序,例如:商品详情的综合排名,还可以按照价格进行排名

Elasticsearch 和 solr

  • 都是基于Lucene搜索服务器基础上开发,都是基于分词技术构建的倒排索引的方式进行查询
  • 在实时建立索引时,solr会产生io阻塞,es不会;在不断动态添加数据时solr效率变低,es无影响
  • solr利用zookeeper进行分布式管理,而es自带该功能,solr需要部署到web服务器上,solr本质是一个动态web项目
  • solr支持更多格式数据,如xml,json,csv等,而es仅支持文件格式
  • 单纯对已有数据进行检索时solr效率更好,而es对动态数据检索时效率更高

单点登录

  • 一处登录多处使用, 前提:单点登录多使用在分布式系统中

购物车实现过程

  • 一个用户必须对应一个购物车,单点登录一定在购物车之前
  • 添加购物车:
    • 未登录:购物车数据保存在Redis/Cookie/local storage中
    • 已登录:Redis(Hash:hset(user:userId:cart , skuId, value))和数据库中
  • 展示购物车:
    • 未登录:直接从cookie/Redis/local storage中获取数据
    • 已登录:显示redis(以前保存的数据) + cookie(登录前保存的购物车)中的购物车数据

消息队列

  • 高并发是分布式系统中最大的特点,使用i消息队列可以解决异步通信
  • 消息的不确定性(弊端):可以采用延迟队列,轮询技术来解决该问题,可以使用activemq

Java面试知识点1的更多相关文章

  1. Java 面试知识点解析(二)——高并发编程篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  2. Java 面试知识点解析(三)——JVM篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  3. Java 面试知识点解析(四)——版本特性篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  4. Java 面试知识点解析(五)——网络协议篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  5. Java 面试知识点解析(六)——数据库篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  6. Java 面试知识点解析(七)——Web篇

    前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...

  7. Java面试知识点之线程篇(三)

    前言:这里继续对java线程相关知识点进行总结,不能间断. 1.yield()方法 yield()的作用是让步.它能让当前线程由“运行状态”进入到“就绪状态”,从而让其它具有相同优先级的等待线程获取执 ...

  8. Java面试知识点之线程篇(二)

    前言:接上篇,这里继续对java线程相关知识点进行总结. 1.notify和notifyall的区别 notify()方法能够唤醒一个正在等待该对象的monitor的线程,当有多个线程都在等待该对象的 ...

  9. Java面试知识点之线程篇(一)

    前言:在Java面试中,一定会遇到线程相关问题,因此笔者在这里总结Java中有关线程方面知识点,多数从网上得来(文中会贴出主要参考链接),有些也是笔者在面试中所遇到的问题,如有错误,请不吝指正.主要参 ...

  10. Java面试知识点汇总

    Java面试知识点汇总 置顶 2019年05月07日 15:36:18 温柔的谢世杰 阅读数 21623 文章标签: 面经java 更多 分类专栏: java 面试 Java面试知识汇总   版权声明 ...

随机推荐

  1. CF 1329B Dreamoon Likes Sequences

    传送门 题目: Dreamoon likes sequences very much. So he created a problem about the sequence that you can' ...

  2. SpringBoot中Mybatis打印sql日志

    application.yml中加上 # springBoot+Mybatis 控制台打印SQL语句 (方式一) logging: level: com.zoctan.api.mapper : deb ...

  3. 如何理解算法时间复杂度的表示法O(n²)、O(n)、O(1)、O(nlogn)等?

    先从 来说,理论上哈希表就是O(1).因为哈希表是通过哈希函数来映射的,所以拿到一个关键字,用哈希函数转换一下,就可以直接从表中取出对应的值.和现存数据有多少毫无关系,故而每次执行该操作只需要恒定的时 ...

  4. Hyperledger Fabric 手动搭建【区块链学习三】

    Hyperledger Fabric 手动搭建 前面我们学习了区块链是什么.还有自动搭建学习东西我们就要从简单到深入(入门到放弃),现在自动部署已经跑通了接下来就是手动搭建Fabric 网络可以更好的 ...

  5. Wireshark抓包与常见问题解决

    简介 Wireshark是一个网络抓包分析软件,当线上出现各种连接相关的问题,如连接不复用,大量CLOSE_WAIT时,可以方便的使用Wireshark抓包软件进行抓包分析 安装 Wirewark在w ...

  6. openvswitch 流表操作

    流表组成 每条流表规则由一些列字段组成,可以分为**基础字段.匹配字段和动作字段**三部分. 在打印流表时,在流表中还存在一些显示字段,如duration,idle_age等,此处把这些字段也暂时归之 ...

  7. Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata

    系列文章目录 第一章 Go 语言打包静态文件以及如何与Gin一起使用Go-bindata 目录 系列文章目录 前言 一.go-bindata是什么? 二.使用步骤 1. 安装 2. 使用 3. 读取文 ...

  8. /usr/bin/ld: cannot find -lcrypto

    当我们使用openssl里边的函数的时候,需要链接crypto的库 如果找不到,加一个软链接,如下: ln -s /usr/lib64/libcrypto.so.1.1 /usr/lib64/libc ...

  9. 【亲测】手把手教你如何破解pycharm(附安装包和破解文件)

    此教程支持最新的2019.3版本的Pycharm,并兼容之前的版本. 一.准备工作: 1.下载Pycharm 有条件的可以自行去官网下载,这里我提供了我下载的版本,已上传到百度网盘,链接在下方. 2. ...

  10. IO优化

    Linux性能优化之CPU.内存.IO优化 https://blog.csdn.net/zyc88888/article/details/79027944 iOS的I/O操作 https://www. ...