SpringBoot 自动化配置原理详解
前言
该文章主要是介绍SpringBoot的自动化配置原理以及如何自己创建一个自动化的配置。
一、SpringBoot是什么?
简单来说SpringBoot是一个脚手架,是对Spring整合其他资源框架的封装。
二、自动化配置原理
SpringBoot要整合其他框架资源,都会以@EnableXXX为启动配置项,在SpringBoot的启动类中有@SpringBootApplication注解,点进去可以看到一个启动自动配置的注解@EnableAutoConfiguration,再点击进去可以看到以下这段代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";
Class<?>[] exclude() default {};
String[] excludeName() default {};
}
重点就在于@Import({AutoConfigurationImportSelector.class}),在AutoConfigurationImportSelector类中有getCandidateConfigurations方法,得到待配置的class的类名集合,这个集合就是所有需要进行自动配置的类,而是是否配置的关键在于META-INF/spring.factories文件中是否存在该配置信息
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
在spring-boot-autoconfigure的jar包的META_INFO/spring.factories中定了很多springboot集成的配置类的类路径。定义了那么多的配置类,我们的项目肯定不能全部用上,那么springboot如何得知我们需要哪些自动配置类,哪些不需要呢?主要看AutoConfigurationImportSelector类中getAutoConfigurationEntry方法,在2.3.3的版本中有128个自动配置类,在springboot找不到资源配置文件时,将会被排除。
springboot是如何做到在我们自己配置了bean,就加载我们自己配置的,而不加载springboot默认的配置bean呢?springboot是通过@ConditionalOnClass、@ConditionalOnMissingClass等一系列的条件注解。
三、如何创建自定义配置资源
看完上述的描述,现在来创建自定义配置资源是不是很简单呢?无非就是创建一个工程,在META_INFO/spring.factories下面配置一个自己的配置类路径。此处就不黏贴项目了(有问题可以留言沟通)
四、总结
简单总结一下springboot自动配置的流程
在springboot如何做到先加载我们自己定义的bean再加载它自己定义的bean,这里涉及到spring对bean的加载过程,由于文章篇幅有限,有兴趣的朋友可以自行查阅或留言,私信交流。
以上就是今天要讲的内容,欢迎留言沟通交流。