当前位置:网站首页>面试攻略系列(三)-- 高级开发工程师面试问些啥?
面试攻略系列(三)-- 高级开发工程师面试问些啥?
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高级特性与最佳实践(最新第二版)》
关于内推
你是否苦恼于自己技术不差但总是得不到大厂面试机会,又拉不下面子求熟人欠别人人情,社招流程慢进度不透明,苦苦等待却不知道面试结果,关注一下公众号即可获得各种大厂内推资格,各种优质岗位等着你,欢迎投递。
边栏推荐
- 二维数组&指针
- FFmpeg multimedia file processing (FFMPEG logging system)
- Rmarkdown教程
- Professor Chen Qiang's "Machine Learning and R Application" course Chapter 14 Assignment
- Map mixed density function and quantile added line
- FPGA-近日工作总结
- kustomize入门示例及基本语法使用说明
- Bitmaps and bit operations
- Explanation of RTSP protocol
- ARM板卡增加路由功能
猜你喜欢
Redis源码剖析之字典(dict)
剑指offer,剪绳子2
npm install失败
error Trailing spaces not allowed no-trailing-spaces 9:14 error Unexpected trailing comma
gin的中间件和路由分组
面试题精选:神奇的斐波那契数列
render解析
Flutter Getting Started and Advanced Tour (7) GestureDetector
Jenkins API groovy调用实践: Jenkins Core Api & Job DSL创建项目
5G China unicom 一般性异常处理
随机推荐
5G China unicom 直放站 网管协议 实时性要求
leetcode 20. Valid Parentheses 有效的括号(中等)
Flutter Getting Started and Advanced Tour (7) GestureDetector
WSA工具箱安装应用商店提示无法工作怎么解决?
read stream special attention
陈强教授《机器学习及R应用》课程 第十三章作业
5G Unicom Network Management Design Ideas
5G China unicom AP:B SMS ASCII Transcoding Requirements
19、学习MySQL 索引
5G China unicom 一般性异常处理
CPU-MIPS32 instruction architecture (unlocked pipeline microprocessor)
面试题精选:神奇的斐波那契数列
SQL Server查询优化 (转载非原创)
The sword refers to the offer, cuts the rope 2
七夕力扣刷不停,343. 整数拆分(剑指 Offer 14- I. 剪绳子、剑指 Offer 14- II. 剪绳子 II)
陈强教授《机器学习及R应用》课程 第十八章作业
FFmpeg多媒体文件处理(ffmpeg操作目录及list的实现)
ArcEngine(九)图形绘制
Standing wave ratio calculation method
JVM之配置介绍(一)