论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
ToB企服应用市场:ToB评测及商务社交产业平台
»
论坛
›
软件与程序人生
›
后端开发
›
Java
›
笑死,面试官又问我SpringBoot自动配置原理 ...
笑死,面试官又问我SpringBoot自动配置原理
刘俊凯
金牌会员
|
2022-12-26 11:15:16
|
显示全部楼层
|
阅读模式
楼主
主题
883
|
帖子
883
|
积分
2653
面试官:好久没见,甚是想念。今天来聊聊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
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
刘俊凯
金牌会员
这个人很懒什么都没写!
楼主热帖
IDEA中集成Git操作以及关于Git中分支说 ...
牛客SQL刷题第三趴——SQL大厂面试真题 ...
袋鼠云春季生长大会最新议程来啦!4月2 ...
SAP MM 使用两个STO实现免关税跨国公 ...
精心总结十三条建议,帮你创建更合适的 ...
github上fork2.4k,star8.7k的这款状态 ...
MySQL ——select语句 一条龙服务 ...
Linux基础篇(5)---》常用命令大全(压 ...
万字解析XML配置映射为BeanDefinition ...
0day安全:软件漏洞技术分析-Crack小实 ...
标签云
挺好的
服务器
快速回复
返回顶部
返回列表