0
点赞
收藏
分享

微信扫一扫

前端构建工具总结

fbd4ffd0717b 2024-06-16 阅读 27

springboot原理篇-springboot(三)

一、起步依赖

直接讲重点:起步依赖的原理就是Maven的依赖传递。

二、自动配置

1、概述

​ SpringBoot的自动配置就是当Spring容器启动后,一些配置类、bean对象就自动存入到了IOC容器中,不需要我们手动去声明,从而简化了开发,省去了繁琐的配置操作,以下就是springboot项目在启动时自动添加的bean对象

在这里插入图片描述

前面我们通过学习bean管理可以知道,在我们使用第三方库的时候,是需要导入配置文件的,这些配置文件中定义了我们需要添加的bean对象,如果没有这个配置文件,而仅仅是在pom文件中添加坐标是不行的,那么我们如何导入这个配置文件呢?springboot提供了如下方法

  • 导入 ImportSelector 接口实现类,@Import 通过实现其中的public String[] selectImports函数,获取我们需要添加的所以bean的全类名!这样我们就能知道我们要添加哪些bean了
@Import({TokenParser.class, HeaderConfig.class})
@SpringBootApplication
public class SpringbootWebConfig2Application {
}

但是,通过上述我们发现,如果添加的第三方依赖很多,使用@Import就显得很麻烦,总不能一个一个写吧,于是,springboot有添加了一个新的注释:EnableXxxx注释,里面封装了@Import注释,我们通过追踪启动类的SpringBootApplication注释就能够发现该注释EnableAutoConfiguration

在这里插入图片描述

  • 我们先来看第一个注解:@SpringBootConfiguration

在这里插入图片描述

通过这里,我们就能知道为什么能改启动类中定义第三方bean了,应为启动类就是一个配置类!!!

  • 接下来再先看@ComponentScan注解:

在这里插入图片描述

所以通过这里我们就能发现,为什么我们在pom文件中只添加坐标不行,那是因为springboot项目只会扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类!

  • 最后我们来看看@EnableAutoConfiguration注解(自动配置核心注解):

在这里插入图片描述

这里我们就能发现,@EnableAutoConfiguration注解里面封装了@Import注解,导入了实现ImportSelector接口的实现类,这样我们就能导入配置类了,通过@EnableAutoConfiguration@ComponentScan两个注解的配合,我们就能添加我们在pom中添加的所有依赖的bean对象!但是我们不知道配置文件在哪里,我们继续跟踪源码

  1. 进入AutoConfigurationImportSelector

在这里插入图片描述

  1. 我们发现AutoConfigurationImportSelector里面实现了selectImports函数,这不正是我们需要的吗!进入getAutoConfigurationEntry

在这里插入图片描述

  1. 进入getCandidateConfigurations

在这里插入图片描述

  1. 成功找到配置文件

在这里插入图片描述

在这里插入图片描述

其中,META-INF/spring.factories貌似在高版本中已经不用了

那么,META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports文件和META-INF/spring.factories文件这两个文件在哪里呢?

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

看到这里,大家就应该明白为什么可以完成自动配置了,原理就是在配置类中定义一个@Bean标识的方法,而Spring会自动调用配置类中使用@Bean标识的方法,并把方法的返回值注册到IOC容器中。

自动配置源码小结

自动配置原理源码入口就是@SpringBootApplication注解,在这个注解中封装了3个注解,分别是:

  • @SpringBootConfiguration
    • 声明当前类是一个配置类
  • @ComponentScan
    • 进行组件扫描(SpringBoot中默认扫描的是启动类所在的当前包及其子包)
  • @EnableAutoConfiguration
    • 封装了@Import注解(Import注解中指定了一个ImportSelector接口的实现类)
      • 在实现类重写的selectImports()方法,读取当前项目下所有依赖jar包中META-INF/spring.factories、META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports两个文件里面定义的配置类(配置类中定义了@Bean注解标识的方法)。

当SpringBoot程序启动时,就会加载配置文件当中所定义的配置类,并将这些配置类信息(类的全限定名)封装到String类型的数组中,最终通过@Import注解将这些配置类全部加载到Spring的IOC容器中,交给IOC容器管理。

举报

相关推荐

0 条评论