系列文章目录
第一章 Spring原理之SpringBoot自动配置原理
一、前言
SpringBoot的智能化,给我们开发带来了许多便利,可同时也增加了我们的理解成本,想成为优秀的开发者,光会用可不行。得要通过学习源码,得理解其中的原理,感悟框架者的思路,这样才能手中无剑胜有剑。今天,我就分享一下自动配置的学习心得吧,如有错漏,就评论留言吧,让我们一起进步~!
二、原理分析
步骤1:主配置类中的@SpringBootApplication注解,会引入@EnableAutoConfiguration注解,从而开启自动配置。
步骤2:而@EnableAutoConfiguration 注解,通过@Import注解引入导入选择器EnableAutoConfigurationImportSelector,目的就是为导入后面的自动配置类。
步骤3:解析@Import注解,并加载相应配置。SpringBoot 是通过SPI机制(简单来说就是基于接口+配置文件来实现动态加载),来读取META-INFO/spring.factories文件,这文件包含了各种自动配置的配置。
别兼我烦,这是我在refresh(),通过一步步断点跟踪源码,可以发现从Beanfacoty的后置处理器为入口,最终在导入选择器EnableAutoConfigurationImportSelector里读取spring.factoies文件的过程。
步骤4:过滤出AutoConfigurationClass:通过getCandidateConfigurations()方法从spring.factories得到候选的自动配置类,然后通过,去重、排除过滤器,得出需要的自动配置类,这些类包含了自动配置的具体实现。
List<String> configurations = getCandidateConfigurations(annotationMetadata,
attributes);
configurations = removeDuplicates(configurations);
configurations = sort(configurations, autoConfigurationMetadata);
Set<String> exclusions = getExclusions(annotationMetadata, attributes);
checkExcludedClasses(configurations, exclusions);
configurations.removeAll(exclusions);
configurations = filter(configurations, autoConfigurationMetadata);
步骤5:条件化加载: 最后SpringBoot会根据一系列的@ConditionalXX注解,来排除或包含特定的自动配置类,而这些条件会根据应用程序的环境和配置动态生效,至此SpringBoot就实现了自动配置功能了。
例如,咱们熟悉的AOP功能,这个自动配置类就要求要有指定类和指定注解才生效。
//更正 2024/6/16
@ConditionalOnProperty表示,只有当配置文件(application.properties或者bootstrap.yml)中和“prefix+name”相同的属性的值和注解上havingValue的值相同时,该配置文件才会生效。而不是有指定注解生效。
比如在 application.properties中配置一条"spring.aop.proxy-target-class = false",可以让springBoot根据有接口就使用JDK动态代理,否则就使用cglib代理动态代理。