springboot 自动配置源码解读

devtools/2025/1/22 20:47:00/

什么是自动装配

当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到IOC容器中。例如 当程序需要用到redis时,在pom.xml文件中引入依赖,然后使用依赖注入的方式直接从IOC容器中拿到相应RedisTemplate实例。

@SpringBootApplication 作用

  1. @SpringBootConfiguration:主启动类可以当做配置类使用,比如注入Bean等。
  2. @ComponentScan:包扫描注解。
  3. @EnableAutoConfiguration(重要):开启自动配置。

在这里插入图片描述

@EnableAutoConfiguration

  1. @AutoConfigurationPackage : 自动配置包注解,默认将主配置类(@SpringBootApplication)所在的包及其子包里面的所有组件扫描到IOC容器中。
  2. @Import : 引入相应的自动装配类,这里是导入了AutoConfigurationImportSelector类,从 所有的spring.factories 文件注入自动配置类到IOC容器。
java">@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";Class<?>[] exclude() default {};String[] excludeName() default {};
}

源码解读

@AutoConfigurationPackage

@Import 引入 Registrar配置类

java">@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import({Registrar.class})
public @interface AutoConfigurationPackage {String[] basePackages() default {};Class<?>[] basePackageClasses() default {};
}
java">PackageImports(AnnotationMetadata metadata) {// 获取包名AnnotationAttributes attributes = AnnotationAttributes.fromMap(metadata.getAnnotationAttributes(AutoConfigurationPackage.class.getName(), false));List<String> packageNames = new ArrayList(Arrays.asList(attributes.getStringArray("basePackages")));Class[] var4 = attributes.getClassArray("basePackageClasses");int var5 = var4.length;// 获取basePackageClasses属性的属性值,并且对于的包名放入packageNames列表中for(int var6 = 0; var6 < var5; ++var6) {Class<?> basePackageClass = var4[var6];packageNames.add(basePackageClass.getPackage().getName());}if (packageNames.isEmpty()) {// 如果packageNames为空,就将AutoConfigurationPackage注解标注的类所在的包名作为packageNamespackageNames.add(ClassUtils.getPackageName(metadata.getClassName()));}this.packageNames = Collections.unmodifiableList(packageNames);
}
@Import(AutoConfigurationImportSelector.class)

直接给到最终代码逻辑 getAutoConfigurationEntry 方法

java">// 判断是否开启自动配置
if (!this.isEnabled(annotationMetadata)) {return EMPTY_ENTRY;
} else {// 获取注解属性AnnotationAttributes attributes = this.getAttributes(annotationMetadata);// 从 spring.factories 文件中获取自动配置类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);configurations = this.getConfigurationClassFilter().filter(configurations);this.fireAutoConfigurationImportEvents(configurations, exclusions);return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
}

参考 自动配置详解

自动装配代码逐行解读


http://www.ppmy.cn/devtools/30742.html

相关文章

link和@import的区别

Link 和 import 是 CSS 中的两种样式表引入方式。在网页设计中&#xff0c;样式表&#xff08;CSS&#xff09;是控制网页外观和布局的重要工具。 在引入样式表时&#xff0c;常见的方法包括使用 <link> 标签和 import 关键字。虽然它们都能实现相同的目标&#xff0c;但…

题目:吃奶酪

问题描述&#xff1a; 解题思路&#xff1a; 枚举每种吃奶酪顺序&#xff0c;并计算其距离&#xff0c;选择最小的距离即答案。v数组&#xff1a;记录顺序。 注意点&#xff1a;1. 每次用于min的s需要重置为0。 2. 实数包括小数&#xff0c;所以结构体内x,y为double类型。 3. 第…

MFC 列表控件删除实例(源码下载)

1、本程序基于前期我的博客文章《MFC下拉菜单打钩图标存取实例&#xff08;源码下载) 》 2、程序功能选中列表控件某一项&#xff0c;删除按钮由禁止变为可用&#xff0c;点击删除按钮&#xff0c;选中的项将删除。 3、首先在主界面添加一个删除参数按钮。 4、在myDlg.cpp 文件…

网络基础(1)网络编程套接字TCP,守护进程化

TCP协议 下面我们来学习一下TCP套接字的使用。 也就是使用一下基本的接口。首先TCP套接字的使用和UDP套接字的使用是大同小异的&#xff0c;但是多了一些步骤。 这里回顾一下&#xff1a;UDP是不可靠的&#xff0c;无连接的协议。而TCP则是可靠的&#xff0c;面向连接的协议…

【笔试训练】day17

1.小乐乐该数字 遇到按位处理的情况可以考虑用字符串去读 代码&#xff1a; #define _CRT_SECURE_NO_WARNINGS 1 #include <iostream> #include<string> using namespace std;int main() {string str;cin >> str;int ans 0;for (int i 0; i < str.siz…

Linux如何redis清空缓存

通过命令清空缓存 登录redis redis-cli -h 127.0.0.1 -p 6379# 如果有密码需要下面这一步 auth 你的密码出现ok表示登录成功 查看所有key keys * 清空整个Redis服务器的数据 flushall

【小沐学Java】VSCode搭建Java开发环境

文章目录 1、简介2、安装VSCode2.1 简介2.2 安装 3、安装Java SDK3.1 简介3.2 安装3.3 配置 4、安装插件Java Extension Pack4.1 简介4.2 安装4.3 配置 结语 1、简介 2、安装VSCode 2.1 简介 Visual Studio Code 是一个轻量级但功能强大的源代码编辑器&#xff0c;可在桌面上…

数论10-即约剩余系

点个关注吧&#xff0c;谢谢&#xff01; 在模 m m m的一个剩余类中&#xff0c;若存在一个元素与 m m m互素&#xff0c;那么该剩余类中所有元素与 m m m互素。 [ 0 ] { k m } [0]\{km\} [0]{km} [ 1 ] { k m 1 } [1]\{km1\} [1]{km1} . . . ... ... [ m − 1 ] { k m…