Spring boot自动配置流程详解?图文版

1:扩展点

1.1什么是SPI机制

SPI 全名 Service Provider Interface(服务提供者接口),只要是针对于厂商或者是插件的.为某个接口寻找服务实现的机制,有点类似于IOC的思想,就是讲装配的控制权移到程序之外,

2:实现原理

当我们需要使用各个三方依赖的时候,就把三方依赖引入进来,然后spring-boot启动的时候,通过jdk的spi机制,加载spring-boot-autoconfigurn和三方依赖中的spring.dacfories,然后找到三方依赖的相关配置,然后注入到spring IOC容器中进行使用
SpringBoot的核心就是自动配置,自动配置又是基于条件判断来配置Bean。关于自动配置的源码在spring-boot-autoconfigure-2.0.3.RELEASE.jar
在这里插入图片描述

3:自动配置原理

1:点到@SpringBootApplication注解

这个注解是一个复合注解,里面还包含了其他的注解
在这里插入图片描述

@SpringBootConfiguration:这个注解的底层是一个@Configuration注解,意思被@Configuration注解修饰的类是一个IOC容器,支持JavaConfig的方式来进行配置;

@ComponentScan:这个就是扫描注解的意思,默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中;

@EnableAutoConfiguration:这个注解表明启动自动装配,里面包含连个比较重要的注解@AutoConfigurationPackage和@Import。

2:点到@EnableAutoConfiguration 注解里面
在这里插入图片描述

@AutoConfigurationPackage: 这个注解的意思和@ComponentScan的意思差不多是一样的,都是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,
但是区别的点在于,@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解,但是@AutoConfigurationPackage扫描
@Enitity、@MapperScan等第三方依赖的注解

@Import(AutoConfigurationImportSelector.class):是自动装配的核心注解,AutoConfigurationImportSelector.class中有个process方法

3:进入AutoConfigurationImportSelector
自动状态的入口
在这里插入图片描述
会先使用jdk的spi机制加载Spring-boot-autoconfigure包中的自动配置文件
在这里插入图片描述

protected AutoConfigurationImportSelector.AutoConfigurationEntry getAutoConfigurationEntry(AutoConfigurationMetadata
autoConfigurationMetadata, AnnotationMetadata annotationMetadata) {
	if (!this.isEnabled(annotationMetadata)) {
		return EMPTY_ENTRY;
	} else {
		AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
		//获取自动配置的类名集合
		List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
		//将自动配置的类名去重
		configurations = this.removeDuplicates(configurations);
		//获取需要去除的列名
		Set<String> exclusions = this.getExclusions(annotationMetadata, attributes);
		this.checkExcludedClasses(configurations, exclusions);
		//将自动配置类名集合里的无用类去除
		configurations.removeAll(exclusions);
		//过滤,autoConfigurationMetadata为过滤条件
		configurations = this.filter(configurations, autoConfigurationMetadata);
		//自动装配导入事件
		this.fireAutoConfigurationImportEvents(configurations, exclusions);
		return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
	}
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值