引言:
Spring Boot作为一个强大的开发框架,通过自动装配能够大幅简化我们的开发工作。本文将深入解析Spring Boot自动装配的原理,探究它是如何工作的以及背后的核心机制。
1什么是Spring-boot自动装配
自动装配是指 Spring Boot 通过分析项目的依赖和配置,自动配置 Spring 应用程序所需的组件,而无需手动配置大量的 XML 配置文件或 Java 代码。Spring Boot 根据项目的依赖和约定来推断出应用程序的配置需求,并自动配置相应的组件或者类。
2.Spring-Boot自动装配原理
要理解SpringBoot自动装配原理肯定离不开@SpringBootApplication注解。注解是 Spring Framework 中的一个元注解。当它放置在配置类上时,它会启用 Spring Boot 的自动配置功能。通常将此注解添加到主应用程序类上。
当我们点进@SpringBootApplication可以发现他由许多注解组合而成,真正的核心注解只有三个:
通过注解名字我们也可以清晰知道@EnableAutoConfiguration(中文意思:启用自动配置)是spring-boot自动配置的关键,在点进@EnableAutoConfiguration注解。
@EnableAutoConfiguration
点进这个注解可以发现@Import(AutoConfigurationImportSelector.class),如下图所示。
@Import是Spring注解之一,用于在配置类中导入其他配置类或者普通的Java类。
通过@Impor注解,我们可以将其他配置类或者普通的Java类导入到当前配置类中,从而实现对这些类的引用和使用。可以用于将多个配置类组合在一起,或者引入第三方库中的配置类。
说白了在这里@Import注解的作用就是将 AutoConfigurationImportSelector 这个类导入当前类,这个类就是实现自动装配的核心。我们点进去看看这个类:
AutoConfigurationImportSelector类
不难发现其中这个类实现了许多接口,大部分接口都是对spring容器初始化和Bean的初始化的扩展接口。其中关注一下DeferredImportSelector它又继承了另一个接口ImportSelector。
这个接口中有个方法selectImports()返回的是一个字符串数组,
所以AutoConfigurationImportSelector类也重写了这个方法。
不难想到,这个数组返回的是需要制动配置的类的全限定名。要想得到需要的配置信息,必然会有一个方法的参数是注解信息,返回的就是我们需要的配置信息,结合方法源码,果然可以找到这个方法——getAutoConfigurationEntry()。
看到这一行,返回了一个字符串数组根据名字可得知getCandidateConfigurations(获取候选配置),就是获取了一些配置信息
点进这个方法看这个方法干了些什么事情(值得注意的是这个方法在spring-boot3.0之后进行了改动,以下用的就是spring-boot3.0之后的版本,其实最大的部分不同就是存储加载配置类的的地方不同)
执行了ImportCandidates.load()方法其中需要传入两个参数
可以看到一个参数最主要的就是获取该类的全限定名,其中LOCATION是一个常量"META-INF/spring/%s.imports";format方法就是将%S替换成后面的参数。就是全限定名。location表示是META-INF/spring/类的全限定名.imports,这样的一个字符串。这个是用来干嘛的呢,通过下面的代码加载进来,我们可以在spring-boot-autoconfigure:这个依赖下找到一个类似的配置文件,可以说就是加载的这个配置文件里面的内容(值的一提的是,上面也说了这是spring-boot3.0之后的,那spring-boot3.0之前的放在什么地方呢?告诉大家在spring.actories里)。
那这个文件里面的内容是什么呢
就是需要和spring0-boot整合或者需要自动配置的配置类或者基础类。最后返回出去。
总结:
到这里,自动装配到底是什么,应该比较清楚了,原来是 SpringBoot 帮我们加载了各种已经写好的Config类文件,实现了这些JavaConfig配置文件的重复利用和组件化。我们不需要再为到底需要哪些类而伤神了,我们只需要通过这个配置文件就可以获得我们需要的类,甚至我们不需要关心怎样获取项目启动所需要的类,只需要一个注解—— @EnableAutoConfiguration