如何点击源码:
首先进去启动类,找到@SpringBootApplication注解 选中按ctrl 点击进入
前四个注解是元注解 与自动配置原理无关
@ComponentScan注解是用来进行组件扫描的,扫描启动类所在的包及其子包下所有被@Component及其衍生注解声明的类。
@SpringBootConfiguration注解上使用了@Configuration,表明SpringBoot启动类就是一个配置类
所以只有@EnableAutoConfiguration注解是关于自动配置的,点击进入
(使用@Import注解,导入了实现ImportSelector接口的实现类。
AutoConfigurationImportSelector类是ImportSelector接口的实现类。)
具体分为一下几个步骤:
1.点进来我们发现有@Import注解点击进入AutoConfigurationImportSelector
2.点击@Import后面的
3.会发现这个类实现了一串串
4.点击进入第一个 DeferredImportSelector发现这个类继承了 ImportSelector
5. 回到上一级(ctrl+alt+左键两次) 就会有一个selectImports类
然后,我们观察返回值,发现if中的为空,所以看else中 返回的是autoConfigurationEntry,,这个是返回值来自于上一行,点击进入
进入之后观察返回值,是configurations和自动配置有关,所以点击getCandidateConfigurations
进入后,因为List<String> configurations = new ArrayList(SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader()));比较复杂 但是断言是可以看懂的可以,根据message看出有关自动配置类在META-INF/spring.factories和META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports中
最后,在左侧项目中
里面找到Maven下的spring-boot-autoconfigure
注意:在2.7以上使用.imports 2.7及以下使用.factories
我们以gson为例.gson的bean对象,进行JSON格式转换。虽然我们没有配置bean对象,但是我们是可以直接注入使用的。原因就是因为在自动配置类当中做了自动配置.
选中,双击ctrl或者shift进入
发现使用@Bean注解将对象放入Spring容器.
总结:SpringBoot的自动配置原理:
SpringBoot主启动类的注解@SpringBootApplication中的一个自动配置注解@EnableAutoConfiguration,这个注解底层使用了@Import注解导入ImportSelector的实现类,实现类中的方法selectImport中扫描了Spring.factories和AutoConfiguration.imports,这两个配置文件中有许多自动配置类,自动配置类中就是用@Bean直接把对象放到Spring容器中.