SpringBoot自动配置原理分析

系列文章目录
第一章 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代理动态代理。

      总结:SpringBoot自动配置就是通过@EnableAutoConfiguration注解引入自动配置逻辑,通过解析@Import注解和读取spring.factories文件加载了一系列配置类,然后再从中过滤出自动配置类,并根据条件化配置来动态加载这些类。从而实现了能根据环境和需求自动配置,简化了开发和部署工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值