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个自动配置类但是不是每一个都要放入容器中呀!
- 我们的关注点在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的自动配置原理是核心,一定要掌握。而且他很简单
- 获得需要自动配置的类spi思想
- 对获得解决进行一顿筛选,智能化,你需要什么他就留下什么,去伪存真。
- 初始化后你就可以开心的用起来了。
- 记住不是100%的自动配置,你的告诉她数据库地址等必要信息,通过谁给呢?yml文件,那么yml文件中写什么?下面会介绍,你不能乱写吧。他给我们定义了格式,我们要遵守,boot他才能认识。
一定要掌握哦!面试一定会问你的!