springboot自动配置的原理

本文从@SpringBootApplication注解入手,探讨Spring Boot自动配置的启动过程。讲解了@EnableAutoConfiguration如何找到META-INF/spring.factories文件,加载自动配置类。重点阐述了@ConfigurationProperties如何将配置文件属性绑定到bean上,以及自动配置类如何导入Spring容器。强调理解XxxxProperties和XxxxAutoConfiguration的作用,以通俗的方式帮助读者理解整个自动配置机制。
摘要由CSDN通过智能技术生成

文章参考来源
以下原理我就从启动类启动的时候开始说起,也是自己学习的一个切入点吧!
首先启动类上有个注解@SpringbootApplication,这个注解是一个复合注解或派生注解,包含三个注解:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
   
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM,
				classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
   
  • @SpringbootConfiguration 允许在上下文中注册额外的bean或导入其他配置类
  • @EnableAutoConfiguration 启动Springboot的自动配置机制
  • @ComponentScan 扫描被@Component @Service @Controller 注解的bean,注解默认会扫描该类所在的包下所有的类

其中@EnableAutoConfiguration 开启自动配置,就是配置这块的核心注解,打开这个注解源码如下:

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
   

这个注解也是一个派生注解,他的关键核心功能就是由注解@Importer提供的,这个注解导入了AutoConfigurationImportSelector.class这个类,点进去看看这个类的源码,
有个方法selectImports(~)

@Override
	public String[] selectImports(AnnotationMetadata annotationMetadata) {
   
		if (!isEnabled(annotationMetadata)) {
   
			return NO_IMPORTS;
		}
		AutoConfigurationMetadata autoConfigurationMetadata = AutoConfigurationMetadataLoader
				.loadMetadata(this.beanClassLoader);
		AutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(
				autoConfigurationMetadata, annotationMetadata);
		return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
	}

这个方法里面会找到项目中所有包下拥有META-INF/spring.factories的jar包。
他的调用路径我就写个大概,其实我也只知道调用路径(下面我简单写一下),并不知道每句代码具体什么意思,关键我觉得我没必要去了解详细的源码,能知道大概的实现自动化配置的流程就好了,不同意的勿喷,可以去看更详细的源码!

selectImports(~)
	--getAutoConfigurationEntry
		--AutoConfigurationImportSelector.getCandidateConfigurations
			--SpringFactoriesLoader.loadFactoryNames
				--loadSpringFactories

比如这里就说下spring-boot-autoconfigure-x.x.x.x.jar里就有一个这样的spring.factories文件。
单看这个文件的话,可以看到我们平时比较熟悉的,比如redis、jdbc、aop等等,全在这里。
而且这个文件是以key-value形式存在的,比如我们自动配置这块,key就是org.springframework.boot.autoconfigure.EnableAutoConfiguration,value就是很多很多个xxxxxAutoConfiguration的类名的列表,这些类都是逗号分隔的。

# Initializers
org.springframework.context.ApplicationContextInitializer=\
org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

# Application Listeners
org.springframework.context.ApplicationListener=\
org.springframework.boot.autoconfigure.BackgroundPreinitializer

# Auto Configuration Import Listeners
org.springframework.boot.autoconfigure.AutoConfigurationImportListener=\
org.springframework.boot.autoconfigure.condition.ConditionEvaluationReportAutoConfigurationImportListener

# Auto Configuration Import Filters
org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
org.springframework.boot.autoconfigure.condition.OnBeanCondition,\
org.springframework.boot.autoconfigure.condition.OnClassCondition,\
org.springframework.boot.autoconfigure.condition.OnWebApplicationCondition

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\
org.springframework.boot.autoconfigure.batch
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值