当前位置:网站首页>面试攻略系列(三)-- 高级开发工程师面试问些啥?
面试攻略系列(三)-- 高级开发工程师面试问些啥?
2022-08-09 12:58:00 【hanyi_】
聊的不止技术。跟着小帅写代码,还原和技术大牛一对一真实对话,剖析真实项目筑成的一砖一瓦,了解最新最及时的资讯信息,还可以学到日常撩妹小技巧哦,让我们开始探索主人公小帅的职场生涯吧!
(PS:本系列文章以幽默风趣风格为主,较真侠和杠精请绕道~)
老胡:“小帅,了解SpringBoot的Starters吗?”
小帅:“了解啊,用起来贼爽呢!它有效的降低了项目开发过程的复杂程度,对于简化开发操作有着非常好的效果,现在完全不用写xml配置了。”
江华:“切,又一个跟风党,你只会怎样Control+C、Control+V吧!”
小帅:“…哪里都有你…”
老胡:“那你写过SpringBoot的Starters吗?”
小帅:“当然写过呀,我封装过一个Starter,专门用来上报数据到监控中心,用过的同学都说爽!”
创建自己的SpringBoot Starter
- 创建一个starter项目,规范下命名方式
- 创建一个ConfigurationProperties属性类,用来保存application.yml这些配置信息,例如接收监控中心的地址、采集频率、采集方式、数据格式等等配置。
- 创建一个AutoConfiguration类,定义你用来自动化配置的bean,例如初始化监控中心的连接,授权校验等等,并按照约定声明到spring.factories文件。这样SpringBoot启动的时候就能初始化你的AutoConfiguration类。
- 打包项目成jar,上传到仓库,别的同事就可以用你的starter了。
老胡:“不错,看来真的写过。刚才你提到,SpringBoot启动的时候会自动初始化你的配置类,它是怎样实现的呢?”
小帅:“因为@EnableAutoConfiguration这个注解,它底下有个@Import注解,就是org.springframework.boot.autoconfigure.AutoConfigurationImportSelector这个类,它会调用SpringFactoriesLoader逐个扫描我们自定义的META-INF/spring.factories文件,加载我们的定义的配置Bean到IOC容器。”
/** * Return the auto-configuration class names that should be considered. By default * this method will load candidates using {@link SpringFactoriesLoader} with * {@link #getSpringFactoriesLoaderFactoryClass()}. * @param metadata the source metadata * @param attributes the {@link #getAttributes(AnnotationMetadata) annotation * attributes} * @return a list of candidate configurations */
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(),
getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you "
+ "are using a custom packaging, make sure that file is correct.");
return configurations;
}
附SpringBoot几个重要的注解关系图
江华:“woc,神奇了,小帅居然不去挠头?”
小帅:“…”
老胡:“别闹,小帅那大箱核桃不是白吃的。”
小帅、江华:“…”
老胡:“小帅,上面你提到,SpringFactoriesLoader会扫描spring.factories文件,加载你的配置类到IOC容器,它是怎样加载你的配置类,具体是怎样实现的呢?”
小帅:“SPI?这块源码我没看过嘿嘿…”(挠头表情)
江华:“老胡,你可以收回刚才说的话了。”
小帅:“…”
老胡:“小帅这样说也没错,我换个问题,刚才你的starter里定义AutoConfiguration文件,打包后其实就是一个个的class文件吧,它又是怎样加载到Spring的IOC容器的呢?”
小帅:“哦哦,你问的是类加载原理啊,这个我知道。加载,验证,准备,解析,初始化。”
附网上一张类加载图
老胡:“这样回答有点表面,你可以用你写的配置类被加载、创建对象,垃圾回收过程等JVM各个区怎样配合的,讲述一下吗?”
小帅:“可以啊。”
- 首先配置类字节码文件被加载到内存。
- JVM会校验字节码文件是否合法,内容是否正确。
- 然后为该类文件的类变量分配内存并设置类变量的初始值(注意初始值一般为0,null也是零值)的 阶段,这些变量所使用的内存都将在方法区进行分配。
- 接着解析出字段、接口、方法,并将符号引用转为直接引用。比如我的配置类A继承类B,那么直接指向类B的内存地址。
- JVM收到需要创建配置类A实例的命令,会先检查JVM方法区常量池里有没有类A的符号引用。如果没有,则会利用双亲委托机制找到合适类加载器加载类A,进行类加载过程,也就是上述过程。如果类A的符号引用,则触发类A初始化,
- 类A初始化会初始化静态代码块和静态变量。
- 接着在堆内存Eden区中分配一片空间,实例化类A。
- 类A寿命长的话,会经历幸存区、老年区,当类A实例不再被GCRoot引用,则下一次GC中被回收分配过内存空间,最后类A被卸载。
江华:“切,小帅你嘚瑟啥,找本书背一下谁都会啦!话说老胡,面试的时候老问这些类加载原理、双亲委托、内存分配的有啥用,工作中用到的次数几乎忽略不计。”
老胡:“纠正一下,没用到并不代表没啥用,实际上工作中这些知识很多地方都用到了,只不过很多同学都浮于表面,更有甚者把自己定位为CRUD工程师,所以面试被问到这些的时候会极度反感。”
老胡:“这些都是一些基础知识,只有熟练掌握理解这些基础知识,不是背下来,你才能进入更深一层。”
江华:“说人话,到底有什么用呢?”
老胡:“比如,你不理解类加载原理,你会知道怎样做字节码增强吗?怎样给进程A中的类动态植入代码吗?比如,你不理解双亲委托,你能写出一个热加载器吗?你会利用类加载的优先级给系统打补丁吗?比如,你不理解JVM运行时数据区和内存分配过程,你会利用jdk提供的工具定位内存泄漏等线上问题吗?”
江华:“啊哈哈,老胡息怒,我这是帮读者问的。这是网上搜到的一幅不过的图。”(强行转移话题)
小帅:“江华你完了,晚上摆一桌吧!啊,小檬等等我,晚上有人请吃饭,听者有份…”
老胡:“…”
参考资料
- https://www.jianshu.com/p/943650ab7dfd
- https://www.cnblogs.com/chenyangyao/p/5296807.html
- 《深入理解Java虚拟机:JVM高级特性与最佳实践(最新第二版)》
关于内推
你是否苦恼于自己技术不差但总是得不到大厂面试机会,又拉不下面子求熟人欠别人人情,社招流程慢进度不透明,苦苦等待却不知道面试结果,关注一下公众号即可获得各种大厂内推资格,各种优质岗位等着你,欢迎投递。
边栏推荐
- Professor Chen Qiang's "Machine Learning and R Application" course Chapter 16 Assignment
- render解析
- 5G China unicom repeater network management protocol real-time requirements
- 用plot_hist_numeric()实现画直方图
- telnet+ftp to control and upgrade the device
- Anta and Huawei Sports Health jointly verify the champion running shoes and lead Chinese sports with innovation
- gin的中间件和路由分组
- Data Mining-06
- Bitmaps and bit operations
- Redis源码剖析之字典(dict)
猜你喜欢
随机推荐
第六届”蓝帽杯“全国大学生网络安全技能大赛 半决赛
正则表达式-re模块
驻波比计算方法
How to reduce the size of desktop icons after the computer is reinstalled
搭建大型分布式服务(四)Docker搭建开发环境安装Mysql
某高校的R语言数据分析期末作业
FFmpeg多媒体文件处理(ffmpeg操作目录及list的实现)
陈强教授《机器学习及R应用》课程 第十六章作业
七夕力扣刷不停,343. 整数拆分(剑指 Offer 14- I. 剪绳子、剑指 Offer 14- II. 剪绳子 II)
Professor Chen Qiang's "Machine Learning and R Application" course Chapter 16 Assignment
第六届“强网杯”全国网络安全挑战赛
Redis源码剖析之跳表(skiplist)
RTSP协议讲解
LeetCode 37. Solve Sudoku
5G Unicom Network Management Design Ideas
Professor Chen Qiang's "Machine Learning and R Application" course Chapter 14 Assignment
剑指 Offer 43. 1~n 整数中 1 出现的次数(递归、数学)
handwritten big pile
Yocto 可以下载的第三方库
问题系列-如何修改或更新localhost里的值