【应用】SpringBoot-自动配置原理

前言

本文简要介绍SpringBoot的自动配置原理。

本文讲述的SpringBoot版本为:3.1.2。

前置知识

在看原理介绍之前,需要知道@Import注解的作用:

  • 可以导入@Configuration注解的配置类、声明@Bean注解的bean方法;
  • 可以导入ImportSelector的实现类;【自动配置原理用到注解的这个作用】
  • 可以导入ImportBeanDefinitionRegistrar的实现类。

原理介绍

从启动类入手

一个常规的SpringBoot项目的启动类内容如下

image-20240411160551186

从启动类上的@SpringBootApplication入手

image-20240411160719344

三个注解箭头指示的注解,各有各的作用:

  • @SpringBootConfiguration:组合了@Configuration注解,表示这是一个配置类
  • @EnableAutoConfiguration:允许自动配置
  • @ComponentScan:Spring的组件扫描,默认扫描main方法所在类所在的包及其子包

其中第二个注解@EnableAutoConfiguration是实现自动配置的关键。

@EnableAutoConfiguration注解入手

image-20240411161048600

可以看到该注解中有一个@Import注解,先说结论:在AutoConfigurationImportSelector类中加载了哪些需要自动配置的Bean,并完成加载,注入到IOC容器中。

到AutoConfigurationImportSelector类

AutoConfigurationImportSelector类入手

image-20240411161526906

可以看出:AutoConfigurationImportSelector类是org.springframework.boot.autoconfigure包下的一个类,实现了DeferredImportSelector等接口

  • org.springframework.boot.autoconfigure:望名生意,自动配置,就是在该包里面,规定了哪些Bean需要配置。
  • DeferredImportSelector:该接口是实现自动配置的关键,里面的selectImports方法规定了哪些Bean需要自动配置。

往下滑,看AutoConfigurationImportSelector类的selectImports方法

image-20240411162621664

红框所示代码:返回了需要自动配置的Bean列表。

this.getAutoConfigurationEntry方法入手

protected AutoConfigurationEntry getAutoConfigurationEntry(AnnotationMetadata annotationMetadata) {
    if (!this.isEnabled(annotationMetadata)) {
        return EMPTY_ENTRY;
    } else {
        AnnotationAttributes attributes = this.getAttributes(annotationMetadata);
        
        // 获取该类所在包下的META-INF/spring/目录中以.imports为后缀结尾的文件里面的内容,作为候选配置列表
        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);
        
        // 过滤掉一些暂时不生效的配置:加了如下注解的bean:@OnxxxCondition
        configurations = this.getConfigurationClassFilter().filter(configurations);
        this.fireAutoConfigurationImportEvents(configurations, exclusions);
        return new AutoConfigurationEntry(configurations, exclusions);
    }
}

该方法中代码的逻辑如上。就剩一个this.getCandidateConfigurations方法需要再探究,里面规定了从哪个地方寻找需要配置的bean列表。

this.getCandidateConfigurations方法入手

image-20240411163754007

再进入箭头所指向的load方法

image-20240411163828626

可以看到:该方法往包下的META-INF/spring/目录中寻找后缀名为.imports的文件。

到org.springframework.boot.autoconfigure包中看看

从idea左侧的依赖列表里面查看:

image-20240411164032607

image-20240411164117630

点开文件里面任意一个类:

image-20240411164350208

image-20240411164415793

都是一个自动配置类,定义有相应的Bean方法。

至此,SpringBoot的自动配置原理就明白了。

原理总结

  • 启动类中有一个@SpringBootApplication注解,包含了@EnableAutoConfiguration代表开启自动装配
  • @EnableAutoConfiguration注解里面组合了一个@Import注解,这个注解是实现自动配置的关键。
  • @Import注解最终的作用可以总结如下:到spring-boot-autoconfigure包下的META-INF/spring目录中寻找.imports结尾的文件,这里面列举了所有需要自动配置的类,程序会读取这些类并加载(但这些类不会全部加载,因为有的类上面有条件注解,需要满足特定条件时才会生效)
    • spring-boot-autoconfigure包下的AutoConfigurationImportSelector类实现了ImportSelector,并重写了selectImports方法
    • selectImports方法中,定义类自动配置类的加载位置。还有一些配置类的去重操作、排除操作等。
  • 55
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
目录结构 尚硅谷_SpringBoot_入门-课程简介 尚硅谷_SpringBoot_入门-Spring Boot简介 尚硅谷_SpringBoot_入门-微服务简介 尚硅谷_SpringBoot_入门-环境准备 尚硅谷_SpringBoot_入门-springboot-helloworld 尚硅谷_SpringBoot_入门-HelloWorld细节-场景启动器(starter) 尚硅谷_SpringBoot_入门-HelloWorld细节-自动配置 尚硅谷_SpringBoot_入门-使用向导快速创建Spring Boot应用 尚硅谷_SpringBoot_配置-yaml简介 尚硅谷_SpringBoot_配置-yaml语法 尚硅谷_SpringBoot_配置-yaml配置文件值获取 尚硅谷_SpringBoot_配置-properties配置文件编码问题 尚硅谷_SpringBoot_配置-@ConfigurationProperties与@Value区别 尚硅谷_SpringBoot_配置-@PropertySource、@ImportResource、@Bean 尚硅谷_SpringBoot_配置-配置文件占位符 尚硅谷_SpringBoot_配置-Profile多环境支持 尚硅谷_SpringBoot_配置-配置文件的加载位置 尚硅谷_SpringBoot_配置-外部配置加载顺序 尚硅谷_SpringBoot_配置-自动配置原理 尚硅谷_SpringBoot_配置-@Conditional&自动配置报告 尚硅谷_SpringBoot_日志-日志框架分类和选择 尚硅谷_SpringBoot_日志-slf4j使用原理 尚硅谷_SpringBoot_日志-其他日志框架统一转换为slf4j 尚硅谷_SpringBoot_日志-SpringBoot日志关系 尚硅谷_SpringBoot_日志-SpringBoot默认配置 尚硅谷_SpringBoot_日志-指定日志文件和日志Profile功能 尚硅谷_SpringBoot_日志-切换日志框架 尚硅谷_SpringBoot_web开发-简介 尚硅谷_SpringBoot_web开发-webjars&静态资源映射规则 尚硅谷_SpringBoot_web开发-引入thymeleaf 尚硅谷_SpringBoot_web开发-thymeleaf语法 尚硅谷_SpringBoot_web开发-SpringMVC自动配置原理 尚硅谷_SpringBoot_web开发-扩展与全面接管SpringMVC 尚硅谷_SpringBoot_web开发-【实验】-引入资源 尚硅谷_SpringBoot_web开发-【实验】-国际化 尚硅谷_SpringBoot_web开发-【实验】-登陆&拦截器 尚硅谷_SpringBoot_web开发-【实验】-Restful实验要求 尚硅谷_SpringBoot_web开发-【实验】-员工列表-公共页抽取 尚硅谷_SpringBoot_web开发-【实验】-员工列表-链接高亮&列表完成 尚硅谷_SpringBoot_web开发-【实验】-员工添加-来到添加页面 尚硅谷_SpringBoot_web开发-【实验】-员工添加-添加完成 尚硅谷_SpringBoot_web开发-【实验】-员工修改-重用页面&修改完成 尚硅谷_SpringBoot_web开发-【实验】-员工删除-删除完成 尚硅谷_SpringBoot_web开发-错误处理原理&定制错误页面 尚硅谷_SpringBoot_web开发-定制错误数据 尚硅谷_SpringBoot_web开发-嵌入式Servlet容器配置修改 尚硅谷_SpringBoot_web开发-注册servlet三大组件 尚硅谷_SpringBoot_web开发-切换其他嵌入式Servlet容器 尚硅谷_SpringBoot_web开发-嵌入式Servlet容器自动配置原理 尚硅谷_SpringBoot_web开发-嵌入式Servlet容器启动原理 尚硅谷_SpringBoot_web开发-使用外部Servlet容器&JSP;支持 尚硅谷_SpringBoot_web开发-外部Servlet容器启动SpringBoot应用原理 尚硅谷_SpringBoot_Docker-简介 尚硅谷_SpringBoot_Docker-核心概念 尚硅谷_SpringBoot_Docker-linux环境准备 尚硅谷_SpringBoot_Docker-docker安装&启动&停止 尚硅谷_SpringBoot_Docker-docker镜像操作常用命令 尚硅谷_SpringBoot_Docker-docker容器操作常用命令 尚硅谷_SpringBoot_Docker-docker安装MySQL 尚硅谷_SpringBoot_数据访问-简介 尚硅谷_SpringBoot_数据访问-JDBC&自动配置原理 尚硅谷_SpringBoot_数据访问-整合Druid&配置数据源监控 尚硅谷_SpringBoot_数据访问-整合MyBatis(一)-基础环境搭建 尚硅谷_SpringBoot_数据访问-整合MyBatis(二)-注解版MyBatis 尚硅谷_SpringBoot_数据访问-整合MyBatis(二)-配置版MyBatis 尚硅谷_SpringBoot_数据访问-SpringData JPA简介 尚硅谷_SpringBoot_数据访问-整合JPA 尚硅谷_SpringBoot_原理-第一步:创建SpringApplication 尚硅谷_SpringBoot_原理-第二步:启动应用 尚硅谷_SpringBoot_原理-事件监听机制相关测试 尚硅谷_SpringBoot_原理-自定义starter 尚硅谷_SpringBoot_结束语

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值