当前位置: 首页 > news >正文

Spring (15)Spring Boot的自动配置是如何工作的

Spring Boot的自动配置是通过条件注解(如@ConditionalOnClass@ConditionalOnBean等)和@EnableAutoConfiguration注解来实现的。这一机制主要是为了简化配置过程,让开发者在满足特定条件时自动配置Spring应用。接下来,我们会深入探讨这一机制是如何工作的,以及它的实现原理。

核心原理

自动配置的核心是@EnableAutoConfiguration注解。这个注解本质上是一个复合注解,它利用Spring框架的@Import注解来收集和注册自动配置类。

@EnableAutoConfiguration注解
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {// ...
}

通过@Import(AutoConfigurationImportSelector.class)EnableAutoConfiguration引入了自动配置的关键组件AutoConfigurationImportSelector

AutoConfigurationImportSelector

AutoConfigurationImportSelector是实现自动配置魔法的关键。它会读取META-INF/spring.factories文件,这个文件位于自动配置模块的资源目录下,列出了可用的自动配置类。

public class AutoConfigurationImportSelector implements ImportSelector {@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return new String[] {/* 自动配置类的全限定名列表 */};}
}

实际上,selectImports方法的实现更复杂,它会分析候选的配置类,只选择符合当前环境条件的配置类。

条件注解

自动配置类通常配合条件注解使用,这些注解定义了配置类生效的条件。如:

  • @ConditionalOnClass:当类路径上存在指定类时配置才生效。
  • @ConditionalOnMissingBean:当容器中不存在指定Bean时配置才生效。
  • @ConditionalOnProperty:当指定的配置属性有一个明确的值时配置才生效。

示例:DataSource自动配置

以DataSource的自动配置为例,来看看自动配置是如何实现的。

@Configuration
@ConditionalOnClass({DataSource.class, EmbeddedDatabaseType.class})
@ConditionalOnMissingBean(DataSource.class)
public class DataSourceAutoConfiguration {@Configuration@ConditionalOnProperty(name = "spring.datasource.type")public static class DataSourceConfiguration {// 省略配置方法...}
}

在这个示例中,DataSourceAutoConfiguration类上的@ConditionalOnClass注解确保了只有当DataSourceEmbeddedDatabaseType类在类路径上可用时,配置才会生效。@ConditionalOnMissingBean注解则确保只有当容器中不存在任何DataSource类型的Bean时,自动配置才会应用。

自动配置原理总结

  1. 启动类上的@EnableAutoConfiguration注解:引入AutoConfigurationImportSelector
  2. AutoConfigurationImportSelector:读取META-INF/spring.factories文件,加载自动配置类。
  3. 条件注解:根据环境(类路径、Bean容器、配置属性等)决定特定配置类是否生效。

这个机制有效地将常见配置的决策过程自动化,减少了开发者需要手动配置的数量,同时保留了灵活性,因为开发者可以通过创建或替换Beans、添加自己的配置类来覆盖默认的自动配置。

http://www.lryc.cn/news/351196.html

相关文章:

  • 【机器学习】—机器学习和NLP预训练模型探索之旅
  • 54. UE5 RPG 增加伤害类型
  • llama3 微调教程之 llama factory 的 安装部署与模型微调过程,模型量化和gguf转换。
  • C++三剑客之std::any(二) : 源码剖析
  • 【C语言】8.C语言操作符详解(2)
  • vivado 物理约束KEEP_HIERARCHY
  • Linux 三十六章
  • ntsd用法+安装包
  • Nacos 微服务管理
  • Kubernetes集群上的Etcd备份和恢复
  • 创建型模式 (Python版)
  • ​​​【收录 Hello 算法】9.4 小结
  • MYSQL数据库基础语法
  • R实验 参数检验(二)
  • 【Linux】进程信号及相关函数/系统调用的简单认识与使用
  • Spring (14)什么是Spring Boot
  • 区间预测 | Matlab实现CNN-KDE卷积神经网络结合核密度估计多置信区间多变量回归区间预测
  • Java集合框架全景解读:从源码到实践精通指南
  • Python | Leetcode Python题解之第107题二叉树的层序遍历II
  • H4vdo 台湾APT-27视频投放工具
  • 数据结构(树)
  • HTML静态网页成品作业(HTML+CSS)——川西旅游介绍网页(2个页面)
  • MySQL数据库单表查询中查询条件的写法
  • SQL靶场搭建
  • Cocos Creator 帧动画播放组件制作详解
  • 基于STM32控制的双轮自平衡小车的设计
  • Dijkstra算法在《庆余年》中的应用:范闲的皇宫之旅
  • HTML静态网页成品作业(HTML+CSS)——利物浦足球俱乐部介绍网页设计制作(5个页面)
  • mac 查看占用80端口的命令
  • 【Qt常用控件】—— 布局管理器