当前位置:网站首页>面试攻略系列(三)-- 高级开发工程师面试问些啥?

面试攻略系列(三)-- 高级开发工程师面试问些啥?

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高级特性与最佳实践(最新第二版)》
关于内推

你是否苦恼于自己技术不差但总是得不到大厂面试机会,又拉不下面子求熟人欠别人人情,社招流程慢进度不透明,苦苦等待却不知道面试结果,关注一下公众号即可获得各种大厂内推资格,各种优质岗位等着你,欢迎投递。
8

原网站

版权声明
本文为[hanyi_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/hanyi_/article/details/107442114