网易首页 > 网易号 > 正文 申请入驻

面试官:说一下SpringBoot的自动配置原理

0
分享至

不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项。除了某些老旧的政府项目或金融项目持有观望态度外,如今的各行各业都在飞速的拥抱这个已经不是很新的Spring启动框架。

当然,作为Spring Boot的精髓,自动配置原理的工作过程往往只有在“面试”的时候才能用得上,但是如果在工作中你能够深入的理解Spring Boot的自动配置原理,将无往不利。

Spring Boot的出现,得益于“习惯优于配置”的理念,没有繁琐的配置、难以集成的内容(大多数流行第三方技术都被集成),这是基于Spring 4.x提供的按条件配置Bean的能力。

初识Spring Boot时我们就知道,Spring Boot有一个全局配置文件:application.propertiesapplication.yml

我们的各种属性都可以在这个文件中进行配置,最常配置的比如:server.portlogging.level.*等等,然而我们实际用到的往往只是很少的一部分,那么这些属性是否有据可依呢?答案当然是肯定的,这些属性都可以在官方文档中查找到:

https://docs.spring.io/spring-boot/docs/2.1.0.RELEASE/reference/htmlsingle/#common-application-properties

(所以,话又说回来,找资料还得是官方文档,百度出来一大堆,还是稍显业余了一些)面试宝典:https://www.yoodb.com

除了官方文档为我们提供了大量的属性解释,我们也可以使用IDE的相关提示功能,比如IDEA的自动提示,和Eclipse的YEdit插件,都可以很好的对你需要配置的属性进行提示,下图是使用Eclipse的YEdit插件的效果,Eclipse的版本是:STS 4。

以上,是Spring Boot的配置文件的大致使用方法,其实都是些题外话。

那么问题来了:这些配置是如何在Spring Boot项目中生效的呢?那么接下来,就需要聚焦本篇博客的主题:自动配置工作原理或者叫实现方式。

工作原理剖析

Spring Boot关于自动配置的源码在spring-boot-autoconfigure-x.x.x.x.jar中:

当然,自动配置原理的相关描述,官方文档貌似是没有提及。不过我们不难猜出,Spring Boot的启动类上有一个@SpringBootApplication注解,这个注解是Spring Boot项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!

@EnableAutoConfiguration

@SpringBootApplication是一个复合注解或派生注解,在@SpringBootApplication中有一个注解@EnableAutoConfiguration,翻译成人话就是开启自动配置,其定义如下:

而这个注解也是一个派生注解,其中的关键功能由@Import提供,其导入的AutoConfigurationImportSelector的selectImports()方法通过SpringFactoriesLoader.loadFactoryNames()扫描所有具有META-INF/spring.factories的jar包。spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。

这个spring.factories文件也是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔,如下图所示:

这个@EnableAutoConfiguration注解通过@SpringBootApplication被间接的标记在了Spring Boot的启动类上。在SpringApplication.run(...)的内部就会执行selectImports()方法,找到所有JavaConfig自动配置类的全限定名对应的class,然后将所有自动配置类加载到Spring容器中。

自动配置生效

每一个XxxxAutoConfiguration自动配置类都是在某些条件之下才会生效的,这些条件的限制在Spring Boot中以注解的形式体现,常见的条件注解有如下几项:


  • @ConditionalOnBean:当容器里有指定的bean的条件下。



  • @ConditionalOnMissingBean:当容器里不存在指定bean的条件下。



  • @ConditionalOnClass:当类路径下有指定类的条件下。公众 号Java精选,回复java面试,获取面试资料,支持在线刷题。



  • @ConditionalOnMissingClass:当类路径下不存在指定类的条件下。



  • @ConditionalOnProperty:指定的属性是否有指定的值,比如@ConditionalOnProperties(prefix=”xxx.xxx”, value=”enable”, matchIfMissing=true),代表当xxx.xxx为enable时条件的布尔值为true,如果没有设置的情况下也为true。


ServletWebServerFactoryAutoConfiguration配置类为例,解释一下全局配置文件中的属性如何生效,比如:server.port=8081,是如何生效的(当然不配置也会有默认值,这个默认值来自于org.apache.catalina.startup.Tomcat)。

ServletWebServerFactoryAutoConfiguration类上,有一个@EnableConfigurationProperties注解:开启配置属性,而它后面的参数是一个ServerProperties类,这就是习惯优于配置的最终落地点。

在这个类上,我们看到了一个非常熟悉的注解:@ConfigurationProperties,它的作用就是从配置文件中绑定属性到对应的bean上,而@EnableConfigurationProperties负责导入这个已经绑定了属性的bean到spring容器中(见上面截图)。那么所有其他的和这个类相关的属性都可以在全局配置文件中定义,也就是说,真正“限制”我们可以在全局配置文件中配置哪些属性的类就是这些XxxxProperties类,它与配置文件中定义的prefix关键字开头的一组属性是唯一对应的。

至此,我们大致可以了解。在全局配置的属性如:server.port等,通过@ConfigurationProperties注解,绑定到对应的XxxxProperties配置实体类上封装为一个bean,然后再通过@EnableConfigurationProperties注解导入到Spring容器中。

而诸多的XxxxAutoConfiguration自动配置类,就是Spring容器的JavaConfig形式,作用就是为Spring 容器导入bean,而所有导入的bean所需要的属性都通过xxxxProperties的bean来获得。

可能到目前为止还是有所疑惑,但面试的时候,其实远远不需要回答的这么具体,你只需要这样回答:

Spring Boot启动的时候会通过@EnableAutoConfiguration注解找到META-INF/spring.factories配置文件中的所有自动配置类,并对其进行加载,而这些自动配置类都是以AutoConfiguration结尾来命名的,它实际上就是一个JavaConfig形式的Spring容器配置类,它能通过以Properties结尾命名的类中取得在全局配置文件中配置的属性如:server.port,而XxxxProperties类是通过@ConfigurationProperties注解与全局配置文件中对应的属性进行绑定的。

通过一张图标来理解一下这一繁复的流程:

图片来自于王福强老师的博客:https://afoo.me/posts/2015-07-09-how-spring-boot-works.html

总结

综上是对自动配置原理的讲解。当然,在浏览源码的时候一定要记得不要太过拘泥与代码的实现,而是应该抓住重点脉络。

一定要记得XxxxProperties类的含义是:封装配置文件中相关属性;XxxxAutoConfiguration类的含义是:自动配置类,目的是给容器中添加组件。

而其他的主方法启动,则是为了加载这些五花八门的XxxxAutoConfiguration类。

作者:圣斗士Morty https://blog.csdn.net/u014745069/article/details/83820511

公众号“Java精选”所发表内容注明来源的,版权归原出处所有(无法查证版权的或者未注明出处的均来自网络,系转载,转载的目的在于传递更多信息,版权属于原作者。如有侵权,请联系,笔者会第一时间删除处理!

最近有很多人问,有没有读者交流群!加入方式很简单,公众号Java精选,回复“加群”,即可入群!

(微信小程序):3000+道面试题,包含Java基础、并发、JVM、线程、MQ系列、Redis、Spring系列、Elasticsearch、Docker、K8s、Flink、Spark、架构设计等,在线随时刷题!

------ 特别推荐 ------

特别推荐:专注分享最前沿的技术与资讯,为弯道超车做好准备及各种开源项目与高效率软件的公众号,「大咖笔记」,专注挖掘好东西,非常值得大家关注。点击下方公众号卡片关注

文章有帮助的话,点在看,转发吧!

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
疑似华为 Mate 70 外观曝光,这造型没谁了!

疑似华为 Mate 70 外观曝光,这造型没谁了!

果粉俱乐部
2024-06-26 12:10:26
张雪峰谈五大更适合女生高考志愿填报的专业,以后可能越来越吃香

张雪峰谈五大更适合女生高考志愿填报的专业,以后可能越来越吃香

雄哥笔谈
2024-06-27 18:24:05
男生查分后默默去厨房做饭,妈妈一看秒懂:高考估分600只考397分

男生查分后默默去厨房做饭,妈妈一看秒懂:高考估分600只考397分

老王侃趣闻
2024-06-26 19:10:03
太炸裂!巴黎脱衣舞娘、阴间走秀,裸胸上阵,看的人头皮发麻

太炸裂!巴黎脱衣舞娘、阴间走秀,裸胸上阵,看的人头皮发麻

九号探秘人
2024-06-27 18:20:58
“5物不能烧,烧了人不顺”,这5样东西千万别烧,老祖宗的忠告要听!

“5物不能烧,烧了人不顺”,这5样东西千万别烧,老祖宗的忠告要听!

农夫也疯狂
2024-06-27 11:12:52
周志豪被媒体评为“最差选择”,孟菲斯灰熊真成冤大头了吗?

周志豪被媒体评为“最差选择”,孟菲斯灰熊真成冤大头了吗?

上观新闻
2024-06-27 18:25:29
属于金婧的娱乐圈文,第一次看到女明星怀孕后上综艺不遮遮掩掩的

属于金婧的娱乐圈文,第一次看到女明星怀孕后上综艺不遮遮掩掩的

奇特短尾矮袋鼠
2024-06-27 18:36:08
中国男篮调整大名单!曝四大新星无缘海外拉练,郭士强精简阵容

中国男篮调整大名单!曝四大新星无缘海外拉练,郭士强精简阵容

老叶评球
2024-06-27 12:16:42
清纯女星沦为干爹“X傀儡”,对男人失去兴趣?

清纯女星沦为干爹“X傀儡”,对男人失去兴趣?

万小刀
2024-06-26 13:42:25
日本媒体有多“流氓”?恶意抓拍女运动员,多张私密照被网站曝光

日本媒体有多“流氓”?恶意抓拍女运动员,多张私密照被网站曝光

咖啡店的老板娘
2024-06-26 18:08:32
晋升正厅三年后,广西一厅官任上被查

晋升正厅三年后,广西一厅官任上被查

鲁中晨报
2024-06-27 11:15:05
2011年药家鑫执行死刑:浑身颤抖求饶到最后一秒,父亲一旁说风凉话

2011年药家鑫执行死刑:浑身颤抖求饶到最后一秒,父亲一旁说风凉话

长夏星河
2024-01-15 20:37:57
《亮剑》剧组太穷,李云龙和常乃超都当群演,还是杀害魏和尚凶手

《亮剑》剧组太穷,李云龙和常乃超都当群演,还是杀害魏和尚凶手

虾剪说剧
2024-06-26 04:55:02
河北男子被逼下跪爬行后续:4名霸凌者身份曝光,教育局急于甩锅

河北男子被逼下跪爬行后续:4名霸凌者身份曝光,教育局急于甩锅

六毛朵朵
2024-06-27 16:58:25
2024年6月下值得购买的电子产品

2024年6月下值得购买的电子产品

电脑吧评测室
2024-06-26 22:08:59
民间算命的事听过吗?觉得可信吗?看看网友的诉说

民间算命的事听过吗?觉得可信吗?看看网友的诉说

鬼菜生活
2024-06-04 17:44:09
今天,杭州钱塘江变这样了 | 今年这场梅雨很不一般……

今天,杭州钱塘江变这样了 | 今年这场梅雨很不一般……

都市快报橙柿互动
2024-06-27 22:51:45
吴彦祖老婆的打扮好独特,这“冲天发”有点奇怪,但配白裙还挺美

吴彦祖老婆的打扮好独特,这“冲天发”有点奇怪,但配白裙还挺美

酒盅故事汇
2024-06-25 20:39:15
税款流失500多亿!网友建议:放过企业,严查明星、主播!

税款流失500多亿!网友建议:放过企业,严查明星、主播!

猫小狸同学
2024-06-27 10:12:58
中国发出警告:90天内不支付358亿赔偿金,18艘军舰就别想要了

中国发出警告:90天内不支付358亿赔偿金,18艘军舰就别想要了

星辰故事屋
2024-06-09 17:09:59
2024-06-28 00:24:49
Java精选
Java精选
一场永远也演不完的戏
1551文章数 3855关注度
往期回顾 全部

头条要闻

因雨水打滑 湖南一罐车侧翻压住小车致5死1轻伤

头条要闻

因雨水打滑 湖南一罐车侧翻压住小车致5死1轻伤

体育要闻

排名只比国足高14位 他们打进欧洲杯16强

娱乐要闻

李雪琴北大学历情况被扒,牵扯多人

财经要闻

争5亿房产、传4P丑闻,百亿大佬又开打了

科技要闻

朱啸虎:高度怀疑GPT-5还能不能做出来

汽车要闻

32万公里实车直播拆解 极氪凭事实证明实力!

态度原创

数码
本地
艺术
公开课
军事航空

数码要闻

3199元起,年度性能巅峰大作一加 Ace 3 Pro 正式发布

本地新闻

冷知识:东北雪糕才是最早的网红雪糕

艺术要闻

穿越时空的艺术:《马可·波罗》AI沉浸影片探索人类文明

公开课

连中三元是哪三元?

军事要闻

玻利维亚前陆军总司令因发动军事政变被捕

无障碍浏览 进入关怀版