12-Springboot自动配置原理&&源码解析

上一篇:11-Springboot factories实现原理-META-INF\spring.factories是怎么起作用的,源码解析,run方法项目入口https://blog.csdn.net/fsjwin/article/details/109734726

Springboot自动配置原理肯定是boot的核心中的核心,首先告诉大家,这个很简单,一点不难,你要是不懂也不耽误写代码,但是你不懂面试肯定不行,另外不懂的话写代码心里发虚,所以,有必要一探究竟。

上面我们介绍了对于META-INF\spring.factories解析后会把获得各个接口即实现类放入cache中。而这其中就有127个自动配置类
在这里插入图片描述
好了下面我们来看看,这个自动配置是怎么工作的。

1. 主启动类

在这里插入图片描述
主启动类会放入main方法中,这样通过反射我们可以获得关于这个类的所有信息。这里主要关注的是这些所有信息中的一个就是注解:

@SpringBootApplication
注意注解没有什么其他的特殊意义,就是一个标识而已,但是底层拿到这个标识后就可以按具体表示做具体的事情了。

2. @SpringBootApplication中的@EnableAutoConfiguration注解

在这里插入图片描述
@EnableAutoConfiguration 这个注解表示这个可以对标注这个注解的类进行自动配置,可以想象,上面127个自动配置类的上面肯定都标注的有@Configuration这个注解(这个注解表示这是个配置bean),不信给你截个图:
在这里插入图片描述
这么多,随便点进去两个看看:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3. @EnableAutoConfiguration中的注解@Import(AutoConfigurationImportSelector.class)

在这里插入图片描述
AutoConfigurationImportSelector.class:这个类,从名字上就可以看出,他是自动配置的选择器,也就是说别看我们手里有127个自动配置类但是不是每一个都要放入容器中呀!

  1. 我们的关注点在AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) 这个方法上
protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
		if (!isEnabled(annotationMetadata)) {
			return EMPTY_ENTRY;
		}
		//获取主配置类中的元数据,即需要配出的自动配置类的属性
		AnnotationAttributes attributes = getAttributes(annotationMetadata);
		//获得127个
		List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes);
		//去重,由于引入的依赖有可能忽悠jar包是重复的,这个里做去重处理
		configurations = removeDuplicates(configurations);
		//获得主配置类上明确指定要剔除的自动配置类
		Set<String> exclusions = getExclusions(annotationMetadata, attributes);
		checkExcludedClasses(configurations, exclusions);
		//剔除掉:上步获得主配置类上明确指定要剔除的自动配置类
		configurations.removeAll(exclusions);
		configurations = getConfigurationClassFilter().filter(configurations);
		// 这个方法就是会根据引入的引来,只自动配置引入的这些依赖需要的自动配置,把无用的通通剔除掉。想想是不是从127个中剔除了不少呀!
		fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationEntry(configurations, exclusions);
	}

主配置类上明确标注的需要剔除的自动配置类:
在这里插入图片描述

从127个中剔除多于的剩下37个自动配置类:
在这里插入图片描述

4. 对这剩下的31个自动配置类进行自动配置

自动配的本质就是@Bean。
把这些需要的配置bean,配置好,放入容器中,需要用的参数可以在yml文件中进行配置。比如数据库的用户名、密码、驱动类、地址等。
这样我们就可以在项目中写代码的时候直接从容器中拿到这些bean直接使用了。

有么有感觉很神奇,boot把所有的事情都做了吗,仁至义尽了。消灭了xml配置文件,在一定程度上页消灭了我们自己通过@Beani自定义一些bean,当然了需要自定义的时候还是需要自定义的哦!

5. 总结

boot的自动配置原理是核心,一定要掌握。而且他很简单

  1. 获得需要自动配置的类spi思想
  2. 对获得解决进行一顿筛选,智能化,你需要什么他就留下什么,去伪存真。
  3. 初始化后你就可以开心的用起来了。
  4. 记住不是100%的自动配置,你的告诉她数据库地址等必要信息,通过谁给呢?yml文件,那么yml文件中写什么?下面会介绍,你不能乱写吧。他给我们定义了格式,我们要遵守,boot他才能认识。

一定要掌握哦!面试一定会问你的!

下一篇:13-Springboot中HttpEncodingAutoConfiguration自动配置详解https://blog.csdn.net/fsjwin/article/details/109740170

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值