萤火小屋

优律的知识库

  • 首页
  • 归档
  • 分类
  • 标签
  • 留言
  • 关于

  • 搜索
消息队列 RabbitMQ Redis 双指针 力扣 动态代理 Git YAML SpringBoot SpringMVC 回溯算法 分治算法 归并排序 快排 手撕 事务 MySQL索引 MySQL 小技巧 Spring Framework Spring 动态规划 Linux Android 贪心算法 操作系统 进程调度模拟 IPv6 数据库 计算机组成原理 计算机基础 栈 Java 静态路由 路由器 交换机 数字通信 网络工程 计算机网络 Web http 大学学习技巧 程序设计 算法

SpringBoot学习笔记-自动装配浅析

发表于 2021-12-12 | 分类于 Spring | 0 | 阅读次数 160

前言

当新建一个SpringBoot项目后,直接就能运行起来,不需要进行额外的配置,那么SpringBoot是怎么做到的呢?

@SpringBootApplication注解

  1. 程序启动的主方法所在的类即为启动类的头上有一个注解为@SpringBootApplication。SpringBoot项目的程序入口必须被这个注解所标注,如果去除掉该注解,程序就不能跑起来。

image.png

package cc.fireflyhut.selftech;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SelfTechApplication {

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

}
  1. 进入该注解,可以发现该注解被其他注解注释着。其中有@SpringBootConfiguration注解和@EnableAutoConfiguration注解,SpringBoot自动装配的关键就在于这两个注解。

image.png

@SpringBootConfiguration注解

@SpringBootConfiguration注解意为SpringBoot配置,被该注解所注的类为SpringBoot配置类。进入@SpringBootConfiguration注解发现它被@Configuration所注,这个注解是Spring的底层注解,意为配置,它所注解的类为配置类,配置类等同于配置文件。

image.png

其实@Configuration注解就是一个组件,点进去可以看到它被@Component所注。

image.png

@EnableAutoConfiguration注解

@EnableAutoConfiguration注解才是自动配置的真正关键,其意为开启自动配置,该注解告诉SpringBoot开启自动配置功能。点进去看一下。

image.png

发现该注解被@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)所注。
其中@Import(Class<?>[] value)注解为Spring底层注解,它其中一个功能是给容器导入组件,导入组件的逻辑由传入的参数类所决定。

@AutoConfigurationPackage注解

先说一下@AutoConfigurationPackage注解,直接点进去看一下。

image.png

进入这个注解可以看到它被@Import(AutoConfigurationPackages.Registrar.class)所注,进入这个Registrar内部类看看它的逻辑实现。

image.png

可以看到打上断点的那一行从传入的注解原信息中获得了类的包名等信息,debug一下看看它启动的时候获得了什么信息。

image.png

通过计算registerBeanDefinitions方法此处获得的包名可以知道这个包就是cc.fireflyhut.selftech。所以@AutoConfigurationPackage注解真正干的活就是将主配置类(@SpringBootApplication所注释的类)的所在包及其所有子包的所有组件扫描到Spring容器中。所以SpringBoot可以加载我们所有的Controller和Serivce,如果组件不在主配置类所在包和及其子包,那就无法被加载的Spring的容器中。

@Import(AutoConfigurationImportSelector.class)注解

回到@EnableAutoConfiguration注解中,再次关注一下@Import(AutoConfigurationImportSelector.class)注解,进入AutoConfigurationImportSelector类中看一下,找到public String[] selectImports(AnnotationMetadata annotationMetadata)方法,这个方法就是告诉Spring哪些组件需要导入到容器中,这些组件将会以全类名的方式通过String数组返回,这些类就是集成SpringBoot的依赖配置类。

image.png

image.png

注:因SpringBoot各版本源码不同,本文章可能有略微错误,欢迎指正。

# Spring # SpringBoot
Java多线程和并发
SpringBoot-Yaml配置文件
  • 文章目录
  • 站点概览
优律

优律

优律的知识库

83 日志
20 分类
44 标签
E-mail Twitter Instagram
Links
  • CZLisyx - 浮生志
  • Vedfolnir
0%
© 2019 — 2023 萤火小屋——优律的博客网站
网站已勉强运行 
Halo博客系统技术支持