• SpringBoot 02 自动装配原理和启动类


    2.1 自动配置原理


    1. 点击进入 spring-boot-starter-parent 的方法

    修改它的版本号,修改一个其它的版本号,然后再修改回来。就可以点击进去了。在这里插入图片描述在这里插入图片描述

    在这里插入图片描述

    pom.xml

    • spring-boot-dependencies:核心依赖。这个东西它就在 父工程里。
    • 我们在引入一些 SpringBoot 依赖的时候,不需要指定版本,就是因为有这些版本仓库做支撑。
    1. 启动器
    		<dependency>
    			<groupId>org.springframework.bootgroupId>
    			<artifactId>spring-boot-starterartifactId>
    		dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 启动器的后缀:比如说 web、test 等。就是 指定的 启动场景。它就会自动的 配置很多东西。

    • 比如 spring-boot-starter-web,它就会帮我们自动导入 Web 环境所有的依赖!

    • SpringBoot 会将所有的功能场景封装成一个又一个的启动器。如果我们想要使用什么功能,需要什么相关的包。就只需要找到对应的启动器即可。

    1. 主程序

    @SpringBootApplication:标注一个类 是一个 SpringBoot 的应用。

    SpringApplication.run():启动一个被 标注为 SpringBoot 应用的 类。


    2.2 分析 @SpringBootApplication 注解

    在这里插入图片描述

    @ComponentScan:根据定义的扫描路径,把符合扫描规则的类装配到 Spring 容器中。excludeFilters (排除的扫描路径),@Filter(过滤器),FilterType.CUSTOM 自定义过滤方式,classes 选择一个过滤类,因为是自定义过滤嘛,所以你肯定要提供一个过滤类。

    @SpringBootConfiguration :SpringBoot 的配置。
          =>@Configuration:Spring 配置类注解。
                =>@Component:Spring 组件 注解。

    那么这个就显然易见了。就是说 @SpringBootConfiguration 其实本质上是 Spring 的 @Configuration,也就是 以 Java 类的形式 去配置 Spring。那么这些类 都在哪呢?所以主要的核心应该在 @EnableAutoConfiguration 注解上。

    @EnableAutoConfiguration :允许自动配置。
          =>@AutoConfigurationPackage:自动配置
          =>@Import({AutoConfigurationImportSelector.class}):导入 自动配置导入选择器。
                =>@Import({AutoConfigurationPackages.Registrar.class}):导入 自动配置包注册器。

    在这里插入图片描述

    先来看下 @AutoConfigurationPackage

    在这里插入图片描述
    发现 它把一个类 注册到 IOC 容器中去了。我们看下 这个类 到底有啥 厉害之处。

    在这里插入图片描述

    registerBeanDefinitions()导入@ComponentScan的包中数据进行自动注册

    determineImports()确定数据导入正确性

    也就是说这个注册类,就是用于读取 依赖于 @ComponentScan 注解,读取到的包中的元数据 AnnotationMetadata metadata 进行自动注册的。也就是说 元数据 metadata 其实 就是 注解的这些东西的数据。



    再来看下 AutoConfigurationImportSelector.class

    • @Import({AutoConfigurationImportSelector.class}) 这个 导入选择器是啥呢?为什么要把这个 类 注册到 Spring IOC 容器当中呢?

    在这里插入图片描述
    我们会看到 这个类的第一个方法,就有点儿意思了。它的意思是说,我们可能会拿到 注解元数据。然后看下这个注解元数据是否支持元数据导入。如果不支持,就返回 new String[0] 空的 字符串数组。如果 支持的话。就 获取自动配置条目。在这里插入图片描述
    你会发现 这里 获取了 大量的 东西,其中 List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);方法主要目的是为了获取所有候选配置。 当然 最后 这些获取的东西,都组装到了 自动配置条目 这个对象里面了。然后 selectImports() 方法 会 通过 autoConfigurationEntry.getConfigurations() 把 Configurations 取出来,转成 一个 字符串数组 返回。那么这个 返回的 东西 其实 就是 配置。

    在这里插入图片描述

    但是 我们 想一想,你是 怎么获取到 获取所有候选配置 的呢 ??

    在这里插入图片描述
    我们发现这个获取候选配置的方法,是通过 SpringFactoriesLoader 这个类的静态方法 loadFactoryNames 用于加载所有需要的配置,那这些配置又是从哪里来呢?

    我们发现 该 方法 的 第一个参数有点儿猫腻。

        protected Class<?> getSpringFactoriesLoaderFactoryClass() {
            return EnableAutoConfiguration.class;
        }
    
    • 1
    • 2
    • 3

    诶,让我们 找到了~ 它这第一个参数 提供的 就是 一个 可以支持自动装配的 类!那么 如果 拿到了 这个类,在 @Configuration 的注解支持下,当然就可以 实现 自动配置了。

    那么这些类 是 从哪里拿到的呢??诶,代码里面 其实 有一句暗示。

    在这里插入图片描述
    META-INF/spring 但是我们 还是 不太确定呀。怎么办?再次探索 loadFactoryNames() 方法。

    在这里插入图片描述

    在这里插入图片描述
    好了,一切 谜底 解开了。它是 到 META-INF/spring.factories 下面 拿到 的 自动装配的类。
    在这里插入图片描述
    来嘛,我们来找一下呗。看到没,是不是找到了。虽然我们 看不太懂,但是 绝对 是 springboot 能看懂的。


    2.3 总结

    在这里插入图片描述

    @SpringBootApplication 只是一个组合注解,在项目启动的时候,它会通过 @EnableAutoConfiguration注解 找到 spring-boot-autoconfigure.jar下的META-INF/spring.factories 文件中的所有自动配置类,并将其加载,这些被 找到的自动配置类。所以 才 实现了 自动装配。

    重磅消息:在 SpringBoot 2.7 之后,通过spring.factories加载自动配置类的方式成为过去式(弃用从spring.factories加载自动配置类),采用全新的方式加载自动配置类:需要被自动加载的类写在META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件里,每一行是配置类的全类名。
    在这里插入图片描述

    2.4 启动类


    SpringApplication

    1. 推断应用的类型是普通的项目还是Web项目
    2. 查找并加载所有可用初始化器,设置到 initializers 属性中
    3. 找出 所有的应用程序监听器,设置到 listeners 属性中
    4. 推断并设置 main 方法的 定义类,找到运行的主类

    在这里插入图片描述

  • 相关阅读:
    Linux网络设备命名规则简介
    【云原生之Docker实战】使用Docker部署WBO在线协作白板
    pytorch 数据的读取
    【阿旭机器学习实战】【9】随机梯度下降(SGD)进行乳腺癌良恶性预测,并与逻辑斯蒂回归预测结果进行对比
    安装配置vscode
    【AI视野·今日Robot 机器人论文速览 第五十六期】Tue, 17 Oct 2023
    2021年03月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试
    文件系统实现
    vue3:10、组合式API-模板引用和defineExpose宏函数
    最热门的跨考考研5大专业是哪些?
  • 原文地址:https://blog.csdn.net/qq_52606908/article/details/126067064