SpringBoot 自动配置原理(超级无敌详细)-1[通俗易懂]

SpringBoot 自动配置原理(超级无敌详细)-1[通俗易懂]我们用Springboot很方便的能将一个框架给搭建起来,是因为它将以前我们需要手动配置的地方都利用自动配置来代替,利用约定大于配置的思想简化了我们开发工作量

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

Spring Boot

  • @SpringBootApplication
    
    • 注解标注在 某个类上, 说明该类为 SpringBoot的主配置类,SpringBoot 就应该运行这个类的main()方法来启动SpringBoot的应用
    • 那**@SpringBootApplication** 是什么来的呢? 点开它,我们能够发现,其实它是一个组合注解 。又着两个重要的注解 @SpringBootConfiguration@EnableAutoConfigurationimage-20200421112603611
    • 那接下来,我们就来分析这两个注解吧。

1.@SpringBootConfiguration


  • @SpringBootConfiguration
    
    • 注解标注在 某个类上, 说明该类为 SpringBoot的 配置类,(注意 是配置类没有主)image-20200421113043417
    • 在该注解下 还有一个 注解为 @Conguration ,即为配置类。 因为SpringBoot中没有 像Spring那样的大量的配置文件,所以为了让SpringBoot 知道哪些是配置类,所以就需要有@Configuration。当然了,@Configuration是Spring下的配置类注解,@SpringBootConfiguration是SpringBoot下的配置类注解,但二者的本质相同
    • 当我们把 @Configuration 在点进去,我们能发现它的本质是一个组件。所以 配置类也是容器中的一个组件
    • image-20200421113659190
    • 加下来我们再看@SpringBootApplication的第二个注解**@EnableAutoConfiguration**

2.@EnableAutoConfiguration


@EnableAutoConfiguration 就是 为SpringBoot实现自动配置的核心注解。它的意思就是开启自动配置功能。也就是说我们之前需要配置的东西,现在都不需要配置了 而在 @EnableAutoConfiguration 的内部又有两个非常重要的注解,分别为 @AutoConfigurationPackage@Import(AutoConfigurationImportSelector.class)image-20200421114404004

1.@AutoConfigurationPackage 自动配置包

  • @AutoConfigurationPackag
    
    • 我们进入 @AutoConfigurationPackag 的内部,我们发现这个该注解是由一个 @Import注解来完成的image-20200421114907205

    • @Import(AutoConfigurationPackages.Registrar.class) 注解是Spring底层的一个注解,它的作用就是给容器中导入一个组件,也就是导入 AutoConfigurationPackages.Registrar.class 的组件 ,那我们也进入 Registrar 类的内部image-20200421115218113它是 AutoConfigurationPackages 下的一个静态内部类**。 这个类(Registrar 类)的作用是给容器中导入组件**

    • 我们主要看后面的 new PackageImport(metadata).getPackageName() ,它是导入一个 metadata(注解源信息)到PackageImport中, 然后获取这个包的包名 。那重点是这个 实例对象获取的包名是什么呢?

    • 我们对这个 new PackageImport(metadata).getPackageName() 右键,找到该功能 new PackageImport(metadata).getPackageName() image-20200421115909976

      对它的值进行计算一下,得到返回得结果是image-20200421120039301

    • 我们发现这个结果就是 与我们 SpringBoot主配置类所在的包的包名

    • 总结: @AutoConfigurationPackag 的作用就是将SpringBoot 主配置类所在的包 及其 下面的所有子包里面的所有组件 扫描到 Spring 容器中

2.@Import(AutoConfigurationImportSelector.class)

  • @Import(AutoConfigurationImportSelector.class)
    
    • 这一个注解的作用就是给容器中导入组件,这个注解需要导入的组件就是 AutoConfigurationImportSelector,也就是自动配置导入选择器,它可以帮我们选择需要导入的组件

    • 进入AutoConfigurationImportSelector 查看源码,我们发现这与SpringBoot1.x版本有着一些区别,在SpringBoot2.x 中有一个静态内部类 image-20200421100632900

      大致的意思是 自动配置组, 能够帮我们完成一系列自动配置的操作。我们的重点回到 该 静态内部类下的process()方法 image-20200421101113080

      调用了getAutoConfigurationEntry()方法,该方法的作用就是告诉 Spring容器需要导入什么组件,并以 String[] 的形式返回全类名 image-20200421101636814

      从configurations(标蓝的一行), 我们可以看出 SpringBoot 已经帮我们自动导入了 124 个组件,从下图可以看出都是以全类名的形式返回。而且这些组件的名字都是以 ...AutoConfiguration 的形式命名,也就是什么自动配置类

      image-20200421101857769

      有了这些自动配置类,我们就免去了手动配置注入功能组件的操作了

    • 那为什么他能做到自动配置呢? 其实这也是有依据的。configurations 这个变量是由 getCandidateConfigurations() 方法得到的, 也就是获取候选的配置

    • image-20200421103056880这里调用了 SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,this.beanClassLoader) , 传入了两个参数image-20200421103335022image-20200421103355729

    • 那我们就来看下 loadFactoryNames() 作用image-20200421104057373在这里又调用了loadSpringFactories(类加载器) 并将类加载器作为参数。

    • image-20200421105432373

    • 首先是在 133 行,从类加载器中加载一个资源,资源路径为FACTORIES_RESOURCE_LOCATION(即为image-20200421104844686)将获取到的一个资源赋值给 Enumeration类型的变量urls, 如果该变量中有下一个元素,说明这里面又包含资源,那就将这个资源加载成 properties 配置文件,并转换成为键值对即 Map类型的数据 进行返回

    • 那我们也来看看 META-INF/spring.factories资源路径下的内容长什么样image-20200421110124952

    • 总结: SpringBoot 在启动的时候就从类路径下的 META-INF/spring.factories 中获取EnableAutoConfiguration指定的值,并将这些值加载到自动配置类导入到容器中,自动配置类 就生效,帮助我们进行自动配置功能。 而这些自动配置类 全都在 spring-boot-autoconfigure-2.2.6.RELEASE.jar 该jar包之下

    • 那我们现在就回到这个 META-INF/spring.factories 文件,我们找一个自动配置类作为示例,就例如最后的

      org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration,\
      

      我们点进去这个自动配置类看看为了配置了什么功能(太多了,随便列举几个在SpringMVC常见的)

      image-20200421110937069

    • 内部资源视图解析器(能够帮我们拼接视图的前后缀)image-20200421111127403

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/171549.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • Python批量修改文件名,文件再多也只要一秒,省时又不闹心

    Python批量修改文件名,文件再多也只要一秒,省时又不闹心前言嗨喽!大家好,这里是魔王对于电脑中的文件夹啊,我们那是新建一个又一个啊,有时候,我们整理资料的时候就会发现,文件夹那是一个杂乱无章,一个一个的去修改太浪费时间,咋今天就来分享一个小技巧:批量修改文件名一、在原有的名字前中后批量加字随意一点,这是我刚刚新建的文件夹和我存放的路径。我们来看看代码,我都详细注释了。importos#导入模块filename=’C:\\Users\\Administrator\\Desktop\\123’#文件地址list_path=os.l

    2022年10月28日
  • XXE修复方案参考

    XXE修复方案参考XXE不同的库修复代码,略有差别,但都是通过:1、禁止加载外部实体;2、不允许XML中含有任何自己声明的DTD。可以解决

  • css animation动画(css3动画分享)

    css3小动画,实在是丰富了前端展示页面的效果。虽然IE8不兼容(爱兼容不兼容,奏是这么傲娇)。但是在谷歌,火狐表现都没差。今天就介绍一个css3动画小插件,分分钟满足你实现各种妖魔化动画效果。1.需要引入css文件:animate.css2.引入js文件:wow.min.js3.找到页面中需要添加动画的元素添加class;比如:wowfadeInRightanimatedan…

  • OpenSSL心血漏洞分析「建议收藏」

    OpenSSL心血漏洞分析「建议收藏」SSL是一种理论,而其具体实现,就有好多了,firefox有自己的实现,旧版本的chrome有自己的实现,Openssl也属于实现的一种。   该漏洞并不是协议上的漏洞,而是针对某个实现的漏洞,说简单点就是:代码写的烂或者考虑不全面。 受影响的OpenSSL版本:OpenSSL1.0.2-betaOpenSSL1.0.1-OpenSSL1.0.1f 

  • ByteBuffer的用法[通俗易懂]

    ByteBuffer的用法[通俗易懂]ByteBuffer也许很多人不常用,其实它是最常用的缓冲区,可以负责缓冲存储一段数据,供数据的写入和读取。ByteBuffer是NIO里用得最多的Buffer。ByteBuffer最核心的方法是put(byte)和get()。分别是往ByteBuffer里写一个字节,和读一个字节。值得注意的是,ByteBuffer的读写模式是分开的,正常的应用场景是:往ByteBuffer里写一些数

  • ExecuteScalar()方法

    ExecuteScalar()方法ExecuteScalar()方法也用来执行SQL语句,但是ExecuteScalar()执行SQL语句后的返回值与ExecuteNonQuery()并不相同,ExecuteScalar()方法的返回值的数据类型是Object类型。如果执行的SQL语句是一个查询语句(SELECT),则返回结果是查询后的第一行的第一列,如果执行的SQL语句不是一个查询语句,则会返回一个未实例化的对象,必须通过类型转

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号