当前位置:网站首页>面试攻略系列(三)-- 高级开发工程师面试问些啥?
面试攻略系列(三)-- 高级开发工程师面试问些啥?
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高级特性与最佳实践(最新第二版)》
关于内推
你是否苦恼于自己技术不差但总是得不到大厂面试机会,又拉不下面子求熟人欠别人人情,社招流程慢进度不透明,苦苦等待却不知道面试结果,关注一下公众号即可获得各种大厂内推资格,各种优质岗位等着你,欢迎投递。
边栏推荐
- Sandbox中的进程/线程相关-1
- 记录本项目中用到的系统调用与C库函数-2
- ftplib+ tqdm upload and download progress bar
- 周末看点回顾|我国IPv6网络全面建成;2022昇腾AI开发者创享日·南京站成功举办…
- 快来扔鸡蛋。
- Professor Chen Qiang's "Machine Learning and R Application" course Chapter 16 Assignment
- FPGA - Summary of bugs in ISE (in update)
- Unicom network management protocol block diagram
- 十六进制字符→十进制数字
- Time series analysis course lab report
猜你喜欢

Ledong Fire Rescue Brigade was invited to carry out fire safety training for cadres

GIN初探,环境安装

七夕力扣刷不停,343. 整数拆分(剑指 Offer 14- I. 剪绳子、剑指 Offer 14- II. 剪绳子 II)

render解析

问题系列-如何修改或更新localhost里的值

Map mixed density function and quantile added line

FFmpeg多媒体文件处理(ffmpeg操作目录及list的实现)

5G China unicom 直放站 网管协议 实时性要求

搭建大型分布式服务(四)Docker搭建开发环境安装Mysql

jenkins api创建自定义pipeline
随机推荐
某高校的R语言数据分析期末作业
FFMPEG多媒体文件处理(ffmpeg文件的删除与重命名)
Deep Learning Based on R Language - Simple Regression Case
NFS pays special attention to the problem of permissions
Ledong Fire Rescue Brigade was invited to carry out fire safety training for cadres
2.微服务'黑话'集锦及Eureka注册中心相关概念
Time series analysis course lab report
LeetCode 37.解数独
LnReader编译
剑指 Offer 57 - II. 和为s的连续正数序列(滑动窗口)
R 语言 2010.1至2021.12艾滋病每月发病人数 时间序列分析
第六届”蓝帽杯“全国大学生网络安全技能大赛 半决赛
glibc 内存管理模型 释放 C库内存缓存
[极客大挑战 2019]Upload
GIN初探,环境安装
leetcode 20. Valid Parentheses 有效的括号(中等)
【TKE】GR+VPC-CNI混用模式下未产品化功能配置
Jenkins API groovy calling practice: Jenkins Core Api & Job DSL to create a project
昇腾AI开发者创享日南京站!一起CANN机器狗+AI机械臂实现硬核智慧救援!燃爆现场~
Draw a histogram with plot_hist_numeric()