笑死,面试官又问我SpringBoot自动配置原理
面试官:好久没见,甚是想念。今天来聊聊SpringBoot的自动配置吧?
候选者:嗯,SpringBoot的自动配置我觉得是SpringBoot很重要的“特性”了。众所周知,SpringBoot有着“约定大于配置”的理念,这一理念一定程度上可以用“SpringBoot自动配置”来解释。
候选者:SpringBoot自动配置的原理理解起来挺简单的,我们在使用SpringBoot的时候,肯定会依赖于autoconfigure这么一个包
候选者:autoconfigure这个包里会有一个spring.factories文件,该文件定义了100+个入口的配置类。比如我们经常使用的redis、kafka等等这样常见的中间件都预置了配置类
候选者:当我们在启动SpringBoot项目的时候,内部就会加载这个spring.factories文件,进而去加载“有需要”的配置类。那我们在使用相关组件的时候,就会非常的方便(因为配置类已经初始化了一大部分配置信息)。
候选者:一般我们只要在application配置文件写上对应的配置,就能通过各种template类直接操作对应的组件啦。
面试官:那是所有的配置类都会加载吗?这个“有需要”的配置类你是怎么理解的?
候选者:不是所有的配置类都会加载的,假设我们没有引入redis-starter的包,那Redis的配置类就不会被加载。具体Spring在实现的时候就是使用 @ConditionalXXX进行判断的。比如Redis的配置类就会有@ConditionalOnClass({RedisOperations.class})的配置,说明当前环境下如果有RedisOperations.class这个字节码,才会去加载Redis的配置类
面试官:哦,这样啊,那了解了。那你知不知道Redis的配置类其实会有初始化RedisTemplate对象的操作,那假设我们没有引入redis-starter包,那他是怎么通过编译的?(当然了,其他的配置类也是有可能有一样的状况)
候选者:嗯,这个我看源码的时候我也发现了。其实就是在autoconfigure包里会定义到相关的依赖,但只是标记为optional并且只在编译环境有效。那这样是能通过编译的,只是不会将其依赖传入到我们的应用工程里。
候选者:这块还是花了我很多时间的,我最后在GitHub 的SpringBoot源码里找到的。
面试官:嗯啊,有点东西的哟。既然都聊到这块了,要不顺便聊聊你对SpringBoot starter的理解?
候选者:嗯,starter这东西就是为了方便调用方去使用相关的组件的嘛,Spring框架也给我们实现了很多好用的starter。
候选者:比如以前我们要用Mybatis框架,可能会引入各种的包才能使用。而starter就是做了一层封装,把相关要用到的jar都给包起来了,并且也写好了对应的版本。这我们使用的时候就不需要引入一堆jar包且管理版本类似的问题了。
候选者:现在很多开源的组件都会提供对应的springboot-starter包给我们去用,要做一个starter包并不难。参照Spring内置的实现就好了:1、在工程里引入 starter 打包相关的依赖。2、在我们工程内建spring.factories文件,编写我们配置类的全限类名。
面试官:嗯,大致都了解了,可以的。最后聊下你是怎么看这块源码的?
候选者:源码具体大概就不记得了,思路倒是还有的。我先从启动类开始,会有个@SpringBootApplication,后面会定位到一个自动配置的注解@EnableAutoConfiguration,那最后就能看到注解内部会去META-INF/spring.factories加载配置类
候选者:这块源码并不难,这个过程也了解到了原来maven有option和scope这俩标签,但确实是SpringBoot比较重要的概念吧。
面试官:好嘞,今天到这就结束了吧。
题外:自动配置这个问题确实被问到过几次。说实在的,对于Spring类、注解的信息我真的记不住。感觉能答出这个流程思路,也就够用了(如果面试官确实是要细究某个类名,那这种公司不去也罢)
约定大于配置:SpringBoot给我们内置了很多配置类,这些配置类也初始化了很多配置(默认值)。当我们要使用的时候,只需要覆盖这些配置项就完事了。即便我们不写,大多数情况下都不需要由我们显示配置出来,但相关组件就能正常访问了。
推荐项目
如果想学Java项目的,我还是强烈推荐我的开源项目消息推送平台Austin,可以用作毕业设计,可以用作校招,可以看看生产环境是怎么推送消息的。
Gitee仓库地址:https://gitee.com/zhongfucheng/austin
GitHub仓库地址:https://github.com/ZhongFuCheng3y/austin
笑死,面试官又问我SpringBoot自动配置原理的更多相关文章
- 这样讲 SpringBoot 自动配置原理,你应该能明白了吧
https://juejin.im/post/5ce5effb6fb9a07f0b039a14 前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题 ...
- springboot自动配置原理以及手动实现配置类
springboot自动配置原理以及手动实现配置类 1.原理 spring有一个思想是"约定大于配置". 配置类自动配置可以帮助开发人员更加专注于业务逻辑开发,springboot ...
- SpringBoot自动配置原理
前言 只有光头才能变强. 文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y 回顾前面Spring的文章(以学习的顺序排好): S ...
- 浅谈springboot自动配置原理
前言 springboot自动配置关键在于@SpringBootApplication注解,启动类之所以作为项目启动的入口,也是因为该注解,下面浅谈下这个注解的作用和实现原理 @SpringBootA ...
- SpringBoot实战之SpringBoot自动配置原理
SpringBoot 自动配置主要通过 @EnableAutoConfiguration, @Conditional, @EnableConfigurationProperties 或者 @Confi ...
- 3. SpringBoot ——自动配置原理浅析
SpringBoot的功能之所以强大,离不开它的自动配置这一大特色.但估计很多人只是知其然而不知其所以然.下面本人对自动配置原理做一个分析: 在使用SpringBoot时我们通过引入不同的Starte ...
- SpringBoot自动配置原理学习
介绍 构建Springboot项目时我们会创建一个启动类 @SpringBootApplication public class DemoApplication { public static voi ...
- 我是如何做到springboot自动配置原理解析
一前言 springboot 2.0.0版本分析,整体的自动配置流程如下: 具体配置参考官方文档:springboot-doc 二 @SpringBootApplication 核心注解@Spring ...
- SpringBoot 自动配置原理,翻源码看一下
初始化一个Springboot项目,在主启动类会有这么一个注解:@SpringBootApplication,自动装配的秘密全在主启动类这个注解里面了 点进去一层会发现有三个子注解组成,分别是 @ ...
- SpringBoot系列二:SpringBoot自动配置原理
主程序类的注解 @SpringBootApplication 注解,它其实是个组合注解,源码如下: @Target({ElementType.TYPE}) @Retention(RetentionPo ...
随机推荐
- 关于pwd命令小技巧-确认当前工作目录的绝对路径中是否包含软链接目录名
Linux中任何一个命令,当你用心研究到深处时,也许总能有着新的发现或者有趣的用途,如下方的pwd命令 对于pwd命令,大家都知道是用于打印当前的工作目录路径,而且是绝对路径 pwd命令两个选项的,默 ...
- PHP Phar反序列化学习
PHP Phar反序列化学习 Phar Phar是PHP的压缩文档,是PHP中类似于JAR的一种打包文件.它可以把多个文件存放至同一个文件中,无需解压,PHP就可以进行访问并执行内部语句. 默认开启版 ...
- SpringBoot框架SpEL表达式注入漏洞复现与原理分析
前言 这是2016年的一个洞,利用条件是至少知道一个触发 springboot 默认错误页面的接口及参数名. 影响版本:1.1.0-1.1.12 1.2.0-1.2.7 1.3.0 修复方案:升级版本 ...
- 经典排序算法之-----选择排序(Java实现)
其他的经典排序算法链接地址:https://blog.csdn.net/weixin_43304253/article/details/121209905 选择排序思想: 思路: 1.从整个数据中挑选 ...
- 快读《ASP.NET Core技术内幕与项目实战》EFCore2.5:集合查询原理揭秘(IQueryable和IEnumerable)
本节内容,涉及4.6(P116-P130).主要NuGet包:如前述章节 一.LINQ和EFCore的集合查询扩展方法的区别 1.LINQ和EFCore中的集合查询扩展方法,虽然命名和使用完全一样,都 ...
- 【保姆教程】RuoYi-Radius搭建实现portal认证
[保姆教程]RuoYi-Radius搭建实现portal认证 一.简介 以若依后台管理框架V4.6.0做为基础框架,实现了ToughRADIUS大部分功能,支持标准RADIUS协议(RFC 2865, ...
- 安装zabbix-agent2之ansible-playbook
zabbix被监控端安装zabbix-agent2之ansible-playbook --- - name: install agent hosts: all vars: server_host: & ...
- 聊聊GPU与CPU的区别
目录 前言 CPU是什么? GPU是什么? GPU与CPU的区别 GPU的由来 并行计算 GPU架构优化 GPU和CPU的应用场景 作者:小牛呼噜噜 | https://xiaoniuhululu.c ...
- LabVIEW+OpenVINO在CPU上部署新冠肺炎检测模型实战
前言 之前博客:[YOLOv5]LabVIEW+OpenVINO让你的YOLOv5在CPU上飞起来给大家介绍了在LabVIEW上使用openvino加速推理,在CPU上也能感受丝滑的实时物体识别.那我 ...
- JVM堆内存转储
在发生内存溢出错误 java.lang.OutOfMemoryError 时, JVM自动执行堆内存转储,以方便事后进行排查和分析. JVM提供了一个命令行启动参数 HeapDumpOnOutOfMe ...