前言
当新建一个SpringBoot项目后,直接就能运行起来,不需要进行额外的配置,那么SpringBoot是怎么做到的呢?
@SpringBootApplication注解
- 程序启动的主方法所在的类即为启动类的头上有一个注解为@SpringBootApplication。SpringBoot项目的程序入口必须被这个注解所标注,如果去除掉该注解,程序就不能跑起来。
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);
}
}
- 进入该注解,可以发现该注解被其他注解注释着。其中有@SpringBootConfiguration注解和@EnableAutoConfiguration注解,SpringBoot自动装配的关键就在于这两个注解。
@SpringBootConfiguration注解
@SpringBootConfiguration注解意为SpringBoot配置,被该注解所注的类为SpringBoot配置类。进入@SpringBootConfiguration注解发现它被@Configuration所注,这个注解是Spring的底层注解,意为配置,它所注解的类为配置类,配置类等同于配置文件。
其实@Configuration注解就是一个组件,点进去可以看到它被@Component所注。
@EnableAutoConfiguration注解
@EnableAutoConfiguration注解才是自动配置的真正关键,其意为开启自动配置,该注解告诉SpringBoot开启自动配置功能。点进去看一下。
发现该注解被@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class)所注。
其中@Import(Class<?>[] value)
注解为Spring底层注解,它其中一个功能是给容器导入组件,导入组件的逻辑由传入的参数类所决定。
@AutoConfigurationPackage注解
先说一下@AutoConfigurationPackage注解,直接点进去看一下。
进入这个注解可以看到它被@Import(AutoConfigurationPackages.Registrar.class)所注,进入这个Registrar内部类看看它的逻辑实现。
可以看到打上断点的那一行从传入的注解原信息中获得了类的包名等信息,debug一下看看它启动的时候获得了什么信息。
通过计算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的依赖配置类。
注:因SpringBoot各版本源码不同,本文章可能有略微错误,欢迎指正。