背景
在技术人员的生涯中,每天都在不停的学习各种知识,但是学习的效率与学习的结果每个人都不太一样。为了监督自己坚持学习以及温故知新,我会定期让我的老师给我出题,以问答的方式去检验一下自己的知识结构,这种方式对我而言很有效,分享出来希望与大家共勉。
问题与思考
模拟角色,Java高级工程师
1、SpringBoot优势?SpringBoot starter启动原理?有没有打包封装一个starter的经验?
这个问题刚听到时有点愣,突然发现自己并没有关注过这块的知识
SpringBoot的优势:
我觉得最核心的就是删繁就简,对一些通用功能进行了封装,而使用SpringBoot搭建项目只要引入一些相关的包,即可完成开箱即用的操作。 具体而言:
(1)可以通过SpringBoot创建独立的Spring应用,个人认为这为微服务理念的实现提供了一种解决方式;
(2)内嵌Tomcat、Jetty或Undertow,这样,我们在平时研发的时候,就省去了打包装载都Tomcat容器发布的功能,可以通过jar包的方式发布研发好的功能;
(3)提供了可以自用的starter来简化构建配置,我们创建项目时,只需要引入一些核心包,就可以启动一个SpringBoot项目,这非常方便快捷;
(4)生态资源很丰富,除了核心功能外,提供了指标监控、运行状况检查、外部化配置等功能延伸,同时可以支持与其他组件的多种形式的融合,延展性很好;
(5)约定大于配置的思想,开箱即用
starter启动原理
starter主要作用:引入模块所需的相关jar包,自动配置各自模块所需的属性
springboot加载时做了些什么工作
(1)pom文件中引入相关jar包,例如spring、springmvc、mybatis、mysql-connector-Java相关jar...
(2)配置web.xml(Listener配置、Filter配置、Servlet配置、log4j配置...)、配置数据库连接、配置Spring事务、配置视图解析器
(3)开启注解、自动扫描功能
(4)配置完成后部署Tomcat、启动调试
如何做的? springboot启动时会去pom文件中引入依赖的starter包中寻找resources/META-INF/spring.factories文件,再根据文件中配置的jar包去扫描项目所依赖的jar包;根据spring.factories配置加载AutoConfigure类;根据@Conditional注解的条件,进行自动配置并将Bean注入到Spring Context上下文中
自己还真没有亲自开发过一个jar包作为springboot的启动项加载,这个是欠缺的地方。
2、ArrayList与LinkedList的区别?
我觉得最核心的区别在于ArrayList底层存储是数组的结构,LinkedList底层则是双链表的结构
3、线程池设置常用的参数?
这个我经常性的是根据具体情况参考方法说明来设置的,比如说线程池的核心线程数、等待策略等
4、乐观锁、悲观锁的区别
我觉得最大的区别是两者假设的前提是不一样的,也就是设计思维是不一样的,乐观锁的设计理念是基于锁内容不总是会被占用,而悲观锁的设计思维是基于锁内容总是会被占用。
5、HashMap与ConcurrentHashMap的区别?
最重要的一个区别应该是线程安全性。
6、Redis常用的功能?缓存穿透、缓存雪崩原因及解决方式?分布式锁这块?红锁?
.....
7、io这块,异步io,同步IO,同步非阻塞IO用过哪些,怎么用的?
举了netty的例子
8、数据库索引的分类?索引的原理?innodb schema下要索引的方式,原理是什么,需要注意什么?
这一下子没想起来
说明平时的工作没有对这一块进行归类总结
数据库索引类型有普通索引、组合索引、全文索引、唯一索引、主键索引
(1)普通索引,基本的索引,没有任何限制,主要是用于加快查询,但是数据是可以重复的;
(2)组合索引,可以在多个字段上创建索引,但是只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用;
(3)全文索引,用来查找文本中关键字,这个感觉跟elasticsearch有类似点;
(4)唯一索引,索引列的值必须唯一,但是允许有控制。这也可以用于组合索引,如果是组合索引,列值的组合必须唯一;
(5)主键索引,这其实是特殊的唯一索引,一个表中智能有一个主键,一般我会在建表的时候同时创建主键索引
个人认为,适当的索引可以提高查询性能,但是不宜过多,因为索引也是需要占用存储空间的,增加索引或者删除索引对数据库有一定影响。
innodb支持事物,采用行锁,支持高并发,数据和索引文件都存在.ldb文件里,并且都缓存在内存里;但是有一点,select count(*)需要扫描全表,统计所有数据
innodb的体系结构有内存结构,线程,磁盘文件三部分;存储结构,逻辑存储单元主要分为表空间、段、区和页。
9、数据库优化的经验
......
10、工作这些年,最自豪的使用技术经验分享
......
总结
短短三十几分钟,我看到了我混乱的知识结构,很多知识没有形成体系,好多细节问题以及底层原理了解浮于表面,要沉下心认真梳理了,否则只是空架子,加油吧