SpringBoot2.0 自动配置的核心

1.新建项目

这个就由读者自己去建(可以参考https://mp.csdn.net/postedit/83375675 idea快速配置)

2.查看项目结构并解析

发现建好之后只有一个类可以使用,那为什么Springboot可以自动配置这么多东西列。我们从@SpringBootApplication这个注解上一探究竟吧。

当我们点进去之后发现如下:

发现里面有一个注解@EnableAutoConfigure(**自动配置) 相信大家一看就知道了是什么意思,我们在点进去看看

它导入了AutoConfigurationImportSelector(自动配置输入选择器)这个类,我们进去看看,就会看见selectImpors()这个方法。
通过debug发现,代码中有个集合包含了xxxAutoConfiguration,然后把这个集合变成string数组返回。

既然上图返回的集合是调用的getCandidateConfigurations(annotationMetadata,attributes),我们再跟踪着看下

这个方法SpringFactoriesLoader.loadFactoryNames(getSpringFactoriesLoaderFactoryClass(), getBeanClassLoader())传了两个参数第一个参数是:EnableAutoConfiguration.class,第二个是类加载器。我们在继续跟踪如下:

可以看到Springboot加载了类路径下的META-INF/spring.factories,我们去找找可以看到如下:

可以看到上面全部是springboot自动加载的配置类。

我随便找一个看看,我这里看的是RedisAutoConfiguration,看看redis是如何配置的

上面的配置也很简单

@Configuration :表示这个类是一个配置类,写springboot项目肯定写过这个注解

@ConditionalOnClass(RedisOperations.class) : 表示RedisOperations存在则启用这个配置。@Conditional不熟悉的可以百度下。这里就不细说了。
@EnableConfigurationProperties(RedisProperties.class) :RedisProperties这个类中初始化了redis的一些配置参数。springboot整合过redis的读者,对下图的配置应该就非常熟悉了,我们在yml或者properties中写的配置就是这个类的熟悉。
@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) :表示导入redis连接的配置

springboot的自动配置原理就是根据AutoConfigurationImportSelector先加载spring-boot-autoconfigure.jar中类路径下的spring.factories的xxxAutoConfiguration一些配置。也可以根据xxxProperties类中的属性根据自己项目的需要改变值