资讯专栏INFORMATION COLUMN

SpringBoot自动配置原理

Rainie / 1853人阅读

摘要:开启自动配置功能后文详解这个注解,学过的同学应该对它不会陌生,就是扫描注解,默认是扫描当前类下的。简单来说,这个注解可以帮助我们自动载入应用程序所需要的所有默认配置。简单理解这二者扫描的对象是不一样的。

前言
只有光头才能变强。
文本已收录至我的GitHub仓库,欢迎Star:https://github.com/ZhongFuCheng3y/3y

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

Spring入门这一篇就够了

Spring【依赖注入】就是这么简单

Spring【AOP模块】就这么简单

Spring【DAO模块】知识要点

SpringMVC入门就这么简单

SpringMVC【开发Controller】详解

SpringMVC【参数绑定、数据回显、文件上传】

SpringMVC【校验器、统一处理异常、RESTful、拦截器】

SpringBoot就是这么简单

SpringData JPA就是这么简单

Spring IOC知识点一网打尽!

Spring AOP就是这么简单啦

外行人都能看懂的SpringCloud,错过了血亏!

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

一、SpringBoot的自动配置原理

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

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

1.1三个重要的注解

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

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

@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

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

@AutoConfigurationPackage:自动配置包

@Import:给IOC容器导入组件

1.2.1AutoConfigurationPackage

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

我们可以发现,依靠的还是@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看看具体的实现是什么:

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

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

简单梳理:

FACTORIES_RESOURCE_LOCATION的值是META-INF/spring.factories

Spring启动的时候会扫描所有jar路径下的META-INF/spring.factories,将其文件包装成Properties对象

从Properties对象获取到key值为EnableAutoConfiguration的数据,然后添加到容器里边。

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

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

1.3总结

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

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

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

官网文档参考:

https://docs.spring.io/spring-boot/docs/2.2.0.BUILD-SNAPSHOT/reference/html/using-spring-boot.html#using-boot-structuring-your-code

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/73205.html

相关文章

  • SpringBoot原理深入篇

    摘要:启动原理和执行原理分析一的启动原理我们打开,注意看下面两个依赖我们第一步是继承了父项目,然后在添加启动器的依赖,项目就会自动给我们导入关于项目所需要的配置和。 上一篇我们看到,我们很轻松的完成了项目的构建,那么SpringBoot是如何做到的呢,在使用的使用又有哪些通用配置和注意事项呢? 其实SpringBoot给我们做了大量的自动配置功能,我们只需要引入对应的启动器就可以直接使用,作...

    gotham 评论0 收藏0
  • 【Java入门】SpringBoot自动配置原理

    摘要:作者谭淼一运行原理的运行是由注解提供的。完成自动配置类。自动配置类主要作用是的配置核心,它会写在中,告知在启动时去读取该类并根据该类的规则进行配置。会检测是否存在类类会查看是否开启该自动配置。 作者:谭淼 一、运行原理 Spring Boot的运行是由注解@EnableAutoConfiguration提供的。 @Target({ElementType.TYPE}) @Retentio...

    468122151 评论0 收藏0
  • java-study-springboot-基础学习-04-自动配置原理

    摘要:即,根据包依赖,添加自动配置。会读取的核心配置文件中的配置备注的条件注解 SpringBoot自动配置 1、自动配置之spring.factories showImg(https://segmentfault.com/img/bVbjyDr?w=693&h=130); showImg(https://segmentfault.com/img/bVbjyDs?w=409&h=184); ...

    elva 评论0 收藏0
  • 这样讲 SpringBoot 自动配置原理,你应该能明白了吧

    摘要:这里有一个参数,主要是用来指定该配置项在配置文件中的前缀。创建一个配置类,里面没有显式声明任何的,然后将刚才创建的导入。创建实现类,返回的全类名。创建实现类,实现方法直接手动注册一个名叫的到容器中。前言 小伙伴们是否想起曾经被 SSM 整合支配的恐惧?相信很多小伙伴都是有过这样的经历的,一大堆配置问题,各种排除扫描,导入一个新的依赖又得添加新的配置。自从有了 SpringBoot 之后,咋...

    cc17 评论0 收藏0
  • SpringBoot | 自动配置原理

    摘要:下班后闲着无聊看了下中的自动配置,把我的理解跟大家说下。上述的每一个自动配置类都有自动配置功能,也可在配置文件中自定义配置。 微信公众号:一个优秀的废人。如有问题,请后台留言,反正我也不会听。 前言 这个月过去两天了,这篇文章才跟大家见面,最近比较累,大家见谅下。下班后闲着无聊看了下 SpringBoot 中的自动配置,把我的理解跟大家说下。 配置文件能写什么? 相信接触过 Sprin...

    KitorinZero 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<