之前我们一起看了Springboot是如何内嵌tomcat的今天我们来说一下SpringBoot 启动时自动配置
正如我们看见的只要pom文件里引了你要的依赖
在使用注解 @Autowired 时就能直接实例化使用 这是怎么做到的呢。我们下面就来一起看看。
首先我们可以看见Springboot启动时只需要main方法里运行main方法就可以启动了
然后加上了一个@SpringbootApplication的注解
那么Springboot启动时的配置一定和这个注解有莫大的关系,我们跟进来看一下
可以看到这里有引入一些注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan
@Documented 注解表明这个注释是由 javadoc记录的。 如果一个类型声明被注释了文档化,它的注释成为公共API的一部分。
@SpringBootConfiguration 这个就是Springboot的配置,标注这个类是一个配置类@EnableAutoConfiguration允许自自动配置关(关键注解) @ComponentScan扫描启动类同级包下的配置进行实例化。
我们先来说一下@SpringBootConfiguration 我们跟进去可以看见下图,可以看出这个SpringBootConfiguration只是@Configuration的派生
所以我们还是要看@EnableAutoConfiguration 我们跟进来可以看到组合注解@AutoConfigurationPackage和@Import(AutoConfigurationImportSelector.class) 我们来进入AutoConfigurationImportSelector
我们进入 AutoConfigurationImportSelector 可以看到他一路来找自动配置
我们进入getCandidateConfigurations 可以看到SpringFactoriesLoader.loadFactoryNames,这里就是来进行Spring工厂加载
我们进来,到这里我们终于要找到正主了
classLoader.getResources
ClassLoader.getSystemResources 这两个指向的是同一个文件我们进去看看
看看我们发现了什么原来他就是来读取这个文件中的预配置好的组件
我们进来文件看看,是不是非常熟悉,就是咱们常用的,这里也就解释了为什么注解写一个 @Autowired 就能自动引入了,他就是扫描你的pom文件和这里看看能不能匹配上如果这里没有那么就只能自己配置@Configuration 来自己启动时加载。
我们随便从这个文件中选一个没有pom文件中没有引的包看看,看看是不是很多红色报错呀。这就对了,你可以再点开这个文件中你再pom文件中引了看看。
这就是Springboot的厉害之处 加载所有组件你引入的就是绿色 没引入就是报红,而且不影响启动。自动配置能做到如此也是厉害了。
本文只是个人观点,如有不正确之处,欢迎指出,我会查证修改。