springboot 自动配置源码解读

server/2024/10/17 15:25:25/

什么是自动装配

当我们程序依赖第三方功能组件时,不需要手动将这些组件类加载到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/server/28212.html

相关文章

四元数代数

书籍&#xff1a;Quaternion Algebras 作者&#xff1a;John Voight 出版&#xff1a;Springer 书籍下载-《四元数代数》这本教科书全面介绍了四元数代数和阶的算术理论&#xff0c;这一主题在数学的不同领域都有应用。这本书为研究生读者撰写&#xff0c;易于阅读和理解&am…

Linux内核--设备驱动(三)总线、设备、驱动模型的探究

目录 一、引言 二、设备驱动模型的实现 ------>2.1、platform总线 ------>2.2、驱动与设备的匹配 ------>2.3、设备的探测 ------>2.4、设备驱动模型的改善 三、设备与驱动的匹配流程 ------>3.1、各级设备的展开 ------>3.2、platform 设备 -----…

C#(C Sharp)学习笔记_方法(Medthod)【十六】

什么是方法&#xff1f; 在编程中&#xff0c;方法&#xff08;Method&#xff09;是一个执行特定操作的代码块。它是一种将逻辑封装起来的方式&#xff0c;使得代码更加模块化、重用性更高&#xff0c;并且易于维护。以下是方法的一些关键特性&#xff1a; 封装性&#xff1a…

Rabbitmq学习

文章目录 MQRabbitMQ安装概念消息模型SpringAMOPFanoutExchangeDirectExchangeTopicExchange消息转换器 MQ 虽然同步调用时效性强&#xff0c;能够立即得到结果&#xff0c;但是存在以下问题&#xff1a; 耦合度高&#xff1a;每次加入新需求都要修改原来的代码性能下降&#x…

05 - 步骤 JSON output

简介 JSON Output 步骤用于将 Kettle 中的行流数据写出到 JSON 格式的文件或流中。它允许用户将 Kettle 中处理过的数据以 JSON 格式进行输出&#xff0c;适用于各种数据处理和交换场景。 什么是行流数据&#xff1f; preview data 中的每一个字段都是一个行流数据 使用 场…

【Unity】修改模型透明度

在 Unity 中修改模型透明度主要有两种方法&#xff1a;通过材质和通过着色器。以下是两种方法的步骤和解释&#xff1a; 方法 1&#xff1a;通过材质 在 Unity 编辑器中&#xff0c;选择你想要修改透明度的模型。在 Inspector 窗口中&#xff0c;找到模型的 Renderer 组件&am…

【maven】pom文件详解和延伸知识

【maven】pom文件详解 【一】maven项目的pom文件详解【1】maven项目的目录结构【2】根元素和必要配置【3】父项目和parent元素【4】项目构建需要的信息【5】项目依赖相关信息&#xff08;1&#xff09;依赖坐标&#xff08;2&#xff09;依赖类型&#xff08;3&#xff09;依赖…

【算法刷题日志】模板 前缀和 | C++题解和代码

题目链接&#xff1a;https://www.starrycoding.com/problem/7 题目描述 给定义一个数组 a a a&#xff0c;有 q 1 q1 q1次询问&#xff0c;对于每次询问&#xff1a; 给定两个整数 l , r l, r l,r&#xff0c;求出 a l a l 1 . . . a r a_l a_{l 1} ... a_{r} al​…