SpringBoot自动配置原理

栏目: Java · 发布时间: 5年前

内容简介:只有光头才能变强。文本已收录至我的GitHub仓库,欢迎Star:回顾前面Spring的文章(以学习的顺序排好):

前言

只有光头才能变强。

文本已收录至我的GitHub仓库,欢迎Star: https://github.com/ZhongFuCheng3y/3y

回顾前面Spring的文章(以学习的顺序排好):

作为一名 Java 程序员,就不可能不了解SpringBoot,如果不了解(赶紧学!)

一、SpringBoot的自动配置原理

不知道大家第一次搭SpringBoot环境的时候,有没有觉得非常简单。无须各种的配置文件,无须各种繁杂的pom坐标,一个main方法,就能run起来了。与其他框架整合也贼方便,使用 EnableXXXXX 注解就可以搞起来了!

所以今天来讲讲SpringBoot是如何实现自动配置的~

1.1三个重要的注解

我们可以发现,在使用 main() 启动SpringBoot的时候,只有一个注解 @SpringBootApplication

SpringBoot自动配置原理

我们可以点击进去 @SpringBootApplication 注解中看看,可以发现有 三个注解 是比较重要的:

SpringBoot自动配置原理

  • @SpringBootConfiguration :我们点进去以后可以发现底层是 Configuration 注解,说白了就是支持 JavaConfig 的方式来进行配置( 使用Configuration配置类等同于XML文件 )。
  • @EnableAutoConfiguration :开启 自动配置 功能(后文详解)
  • @ComponentScan :这个注解,学过Spring的同学应该对它不会陌生,就是 扫描 注解,默认是扫描 当前类下 的package。将 @Controller/@Service/@Component/@Repository 等注解加载到IOC容器中。

所以, Java3yApplication 类可以被我们当做是这样的:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
public class Java3yApplication {

    public static void main(String[] args) {
        SpringApplication.run(Java3yApplication.class, args);
    }
}

1.2重点EnableAutoConfiguration

我们知道SpringBoot可以帮我们减少很多的配置,也肯定听过“约定大于配置”这么一句话,那SpringBoot是怎么做的呢?其实靠的就是 @EnableAutoConfiguration 注解。

简单来说,这个注解可以帮助我们 自动载入 应用程序所需要的所有 默认配置

介绍有一句说:

if you have tomcat-embedded.jar on your classpath you are likely to want a TomcatServletWebServerFactory

如果你的类路径下有 tomcat-embedded.jar 包,那么你很可能就需要TomcatServletWebServerFactory

我们点进去看一下,发现有 两个 比较重要的注解:

SpringBoot自动配置原理

@AutoConfigurationPackage
@Import

1.2.1AutoConfigurationPackage

网上将这个 @AutoConfigurationPackage 注解解释成 自动配置包 ,我们也看看 @AutoConfigurationPackage 里边有什么:

SpringBoot自动配置原理

我们可以发现,依靠的还是 @Import 注解,再点进去查看,我们发现重要的就是以下的代码:

@Override
public void registerBeanDefinitions(AnnotationMetadata metadata,
        BeanDefinitionRegistry registry) {
    register(registry, new PackageImport(metadata).getPackageName());
}

默认 的情况下就是将:主配置类( @SpringBootApplication )的所在包及其子包里边的组件扫描到Spring容器中。

  • 看完这句话,会不会觉得,这不就是ComponentScan的功能吗?这俩不就重复了吗?

我开始也有这个疑问,直到我看到文档的这句话:

it will be used when scanning for code @Entity classes.

It is generally recommended that you place EnableAutoConfiguration (if you're

not using @SpringBootApplication) in a root package so that all sub-packages

and classes can be searched.

比如说,你用了Spring Data JPA,可能会在实体类上写 @Entity 注解。这个 @Entity 注解由 @AutoConfigurationPackage 扫描并加载,而我们平时开发用的 @Controller/@Service/@Component/@Repository 这些注解是由 ComponentScan 来扫描并加载的。

  • 简单理解:这二者 扫描的对象是不一样 的。

1.2.2回到Import

我们回到 @Import(AutoConfigurationImportSelector.class) 这句代码上,再点进去 AutoConfigurationImportSelector.class 看看具体的实现是什么:

SpringBoot自动配置原理

我们再进去看一下这些配置信息是从哪里来的(进去getCandidateConfigurations方法):

SpringBoot自动配置原理

这里包装了一层,我们看到的只是通过SpringFactoriesLoader来加载,还没看到关键信息,继续进去:

SpringBoot自动配置原理

简单梳理:

  • FACTORIES_RESOURCE_LOCATION 的值是 META-INF/spring.factories
  • Spring启动的时候会扫描所有jar路径下的 META-INF/spring.factories ,将其文件包装成Properties对象
  • 从Properties对象获取到key值为 EnableAutoConfiguration 的数据,然后添加到容器里边。

SpringBoot自动配置原理

最后我们会默认加载113个默认的配置类:

SpringBoot自动配置原理

有兴趣的同学可以去翻一下这些文件以及配置类哦:

SpringBoot自动配置原理

1.3总结

@SpringBootApplication 等同于下面三个注解:

@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan

其中 @EnableAutoConfiguration 是关键(启用自动配置),内部实际上就去加载 META-INF/spring.factories 文件的信息,然后筛选出以 EnableAutoConfiguration 为key的数据,加载到IOC容器中,实现自动配置功能!

SpringBoot自动配置原理

官网文档参考:

英语不好的同学可以像我一样,对照着来看:

SpringBoot自动配置原理

最后

乐于输出 干货 的Java技术公众号:Java3y。公众号内有200多篇 原创 技术文章、海量视频资源、精美脑图,不妨来 关注 一下!

SpringBoot自动配置原理

觉得我的文章写得不错,不妨点一下


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

中国机器人

中国机器人

[中]王鸿鹏、[中]马娜 / 辽宁人民出版社 / 2017-1-1 / 48.00元

本书对中国机器人领域的发展历史做了引人入胜的介绍,中国机器人成长的过程也是中国经济由弱到强的历程。本书实际是选择了一个独特的视角来解读中国数十年的政治、经济、国家战略问题。中国的未来充满了多重可能性,本书对想了解中国当代与未来发展战略的读者是难得的读本,对智能制造这一当今世界*受关注的高科技领域在战略层面和科技伦理层面进行了深入地剖析和思考,其中提出的诸多前沿性观点是全球都将面对的问题,对中国科学......一起来看看 《中国机器人》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具