点击关注公众号,回复“1024”获取2TB学习资源!

引言

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

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

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

Spring Boot的配置文件

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

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

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

(所以,话又说回来,找资料还得是官方文档,百度出来一大堆,还是稍显业余了一些)

除了官方文档为我们提供了大量的属性解释,我们也可以使用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项目必不可少的注解。那么自动配置原理一定和这个注解有着千丝万缕的联系!另外,关注民工哥技术之路公众号,回复“Java全栈知识体系”,送你一份技术宝典!

@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:当类路径下有指定类的条件下。

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

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

关于Spring boot常用的注解请参阅:

以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类。

来源:blog.csdn.net/u014745069/article/details/83820511

推荐阅读 点击标题可跳转

面试官也很震惊! 小伙,你这单点登录学的可以啊

牛逼哄哄的全链路监控系统!搭建起来没有那么难

华为:活下来!或将卖掉 X86 服务器业务?

吊炸天的 JD-hotkey !单机 QPS 高达 370000

装逼神器,用起来真香!网友们直呼 666

Spring Batch 批处理框架,真的强啊!!

速来!整理了 25 个 PDF 电子书免费下载

带你彻底搞懂 Redis 16 大应用场景

PS:因为公众号平台更改了推送规则,如果不想错过内容,记得读完点一下“在看”,加个“星标”,这样每次新文章推送才会第一时间出现在你的订阅列表里。

随手在看、转发是最大的支持!

Spring Boot 面试杀手锏—自动配置原理相关推荐

  1. Spring Boot面试杀手锏————自动配置原理

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

  2. SpringBoot面试杀手锏——自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 来源:blog.csdn.net/u014745069/ article/details/83820511 引言 不论在工作中,亦或 ...

  3. Spring Boot : Spring boot 的 AutoConfigurationImportSelector 自动配置原理

    1.美图 2.概述 配置文件能配置的属性参照 自动配置原理: SpringBoot启动的时候加载主配置类,开启了自动配置功能@EnableAutoConfiguration 参考:Spring : @ ...

  4. Springboot面试杀手锏-自动配置原理

    前言 随着互联网越来越流行,springboot已经成为我们无论是工作,还是面试当中,不得不掌握的技术.说起springboot笔者认为最重要的功能非自动配置莫属了,为什么这么说?如果参与过以前spr ...

  5. Spring Boot 灵活实现自动配置背后的故事~用起来更香了

    最近一直忙着在做新应届生的员工技术培训和面试 ,培训的则是Spring Boot部分的内容,这部分也是面试常问的点,于是想到了各位读者大大,特地的把内容分享大家一份. 不知道大家第一次搭Spring ...

  6. Spring Security 实战:Spring Boot 下的自动配置

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | 公众号「码农小胖哥」 1. 前言 我们在前几篇 ...

  7. Spring Boot 面试杀手锏:自动配置原理

    欢迎关注方志朋的博客,回复"666"获面试宝典 不论在工作中,亦或是求职面试,Spring Boot已经成为我们必知必会的技能项.除了某些老旧的政府项目或金融项目持有观望态度外,如 ...

  8. spring boot (3.自动配置@enableautoconfiguration)

    主入口类/启动类 @SpringBootApplication 启动类是一个组合注解 配置类也是容器中的一个组件 第一个注解@springbootconfigration . @Target({Ele ...

  9. Spring Boot常见企业开发场景应用、自动配置原理结构分析

    读者应具备: Spring SpringMVC服务器端开发基础 Maven基础 本篇主要介绍Spring Boot在企业开发中常见场景的使用.以及Spring Boot的基本原理结构. 以下为本篇设计 ...

最新文章

  1. 万字长文带你入门 GCN
  2. Matlab中bwlabel函数的使用
  3. linux remote
  4. Spread for ASP.NET技术白皮书
  5. 基于Struts2的供求信息网设计(一)
  6. 4.vuex学习之getters、mapGetters
  7. 人月神话阅读笔记 03
  8. C#基础第三天-作业-集合-冒泡排序-模拟名片
  9. oracle 减少回表,減少oracle sql回表次數 提高SQL查詢性能 | 學步園
  10. 生成特定分布随机数的方法
  11. arcgis-tomcat-cors
  12. Linux两个网卡mac地址重复,ARP响应Linux服务器上的单个MAC地址,同一网络上有多个接口...
  13. struts2上传多文件(b)
  14. 计算机不能上网 检查路线,腾达(Tenda)路由器不能上网的解决方法
  15. 从球衣了解“红魔”曼联历史
  16. 手机号码检测开通微信
  17. java安装报错循环冗余检查_Java中循环冗余校验的实现方式介绍
  18. CSS复合选择器、元素显示模式、背景
  19. 虚拟服务器有没有加入bt端口,三分钟学会架设BT服务器
  20. 85程序锁的工作原理

热门文章

  1. 首个国产新冠疫苗专利引用行为讨论
  2. 终于官宣了!OPPO R15在手机屏幕上又有新突破
  3. 上海招聘java程序员有哪些要求
  4. 如何完成两幅图片差异对比
  5. 乘法逆元 +数论分块 +平方和公式
  6. java的开发工具_Java中常用的开发工具有哪些
  7. 罗师傅这样的菜鸟太多,才会让中华武术不被人待见
  8. 阿里云盘一分钟完成简单任务 领1176G永久容量
  9. Linux学习--09
  10. c语言逻辑与的作用,C++ 、||、!逻辑运算符用法详解