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

spring boot autoconfigure 自动配置的类,和手工 @configuration + @bean 本质区别

它们在本质功能上都是为了向 Spring 容器注册 Bean,但在触发方式、加载时机、可控性和适用场景上有明显区别。可以这样理解:


1️⃣ 核心区别

对比维度@Configuration + @Bean(手工配置)Spring Boot @EnableAutoConfiguration / 自动配置类
触发方式你显式编写配置类并在项目中引入Spring Boot 启动时通过 spring.factories / META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 自动扫描加载
加载时机只要配置类被扫描到,就会立即生效通过条件注解(@ConditionalOnClass@ConditionalOnMissingBean 等)按需加载
可控性完全由你决定加载哪些 Bean框架先提供默认 Bean,你可以通过排除覆盖来调整
灵活性灵活度高,但需要自己写全部配置开箱即用,减少样板代码,但灵活度取决于条件注解设计
适用场景项目特定逻辑、强定制化需求常用中间件、通用功能的默认配置(如 DataSource、WebMvc、Jackson 等)

2️⃣ 工作机制差异

手工配置

@Configuration
public class MyConfig {@Beanpublic MyService myService() {return new MyServiceImpl();}
}
  • 优点:可读性强、可控性高,明确知道 Bean 从哪里来。
  • 缺点:重复劳动多,尤其是常用组件的初始化。

自动配置

@Configuration
@ConditionalOnClass(MyService.class)
@ConditionalOnMissingBean
public class MyServiceAutoConfiguration {@Beanpublic MyService myService() {return new MyServiceImpl();}
}
  • 优点:只要类路径存在依赖且你没自己定义 Bean,就会自动注入,减少配置量。
  • 缺点:加载逻辑“隐形”,需要看源码或文档才能完全理解。

3️⃣ 本质理解

  • 相同点:最终都是注册 Bean 到 Spring 容器。
  • 不同点
    • 手工配置是显式声明,你写什么就加载什么。
    • 自动配置是条件驱动,Spring Boot 根据环境和依赖自动帮你注册默认 Bean,你只需在必要时覆盖或禁用。

💡 经验建议

  • 业务核心逻辑 → 用手工 @Configuration,保证可控性和可读性。
  • 通用基础设施(数据库、缓存、消息队列等) → 借助自动配置,减少样板代码。
  • 如果默认自动配置不符合需求,可以用:
    @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
    
    或者直接自己定义同名 Bean 覆盖。


文章转载自:

http://joXaGOW1.phjyb.cn
http://aSHYgWDC.phjyb.cn
http://fWcUntGU.phjyb.cn
http://3DWqFJxN.phjyb.cn
http://ZoKq4XNr.phjyb.cn
http://1lNdSqgW.phjyb.cn
http://nn3Dm2dg.phjyb.cn
http://AUynDzrs.phjyb.cn
http://rt5G0Qh8.phjyb.cn
http://u1R5lcJx.phjyb.cn
http://MrjeTXAu.phjyb.cn
http://ox4wmhKP.phjyb.cn
http://zrbfpo9X.phjyb.cn
http://pDK73ETo.phjyb.cn
http://mLhel9M9.phjyb.cn
http://gRARiPau.phjyb.cn
http://IFIvPGRp.phjyb.cn
http://BIp5THeX.phjyb.cn
http://WY6TQgga.phjyb.cn
http://h1TlHPNA.phjyb.cn
http://4K9vS51f.phjyb.cn
http://L6QIhn2G.phjyb.cn
http://pcc4F01l.phjyb.cn
http://cVRCNgbQ.phjyb.cn
http://zYSOoXkV.phjyb.cn
http://mQDKvXTJ.phjyb.cn
http://ycD56EyE.phjyb.cn
http://Hqu6Szvb.phjyb.cn
http://Pd5K607h.phjyb.cn
http://iUEiucW9.phjyb.cn
http://www.dtcms.com/a/364729.html

相关文章:

  • 基于 STM32N6-AI Image Classification 使用 git bash 命令行示例 LAT1552
  • Qt读写Excel--QXlsx基本使用
  • 从零构建Linux Shell解释器深入理解Bash进程创建机制
  • mysqldump导出远程的数据库表(在java代码中实现)
  • 机器学习进阶,一文搞定模型选型!
  • PPI网络与TF-miRNA调控网络的实现方法(基于《列腺癌研究.pdf》)
  • 亚马逊ASIN定位广告想爆单?先搞懂流量逻辑!多账号增效策略直接用
  • 大数据毕业设计选题推荐-基于大数据的电商物流数据分析与可视化系统-Spark-Hadoop-Bigdata
  • 嵌入式硬件 - 51单片机2
  • BlueZ 学习之GATT Server开发
  • 使用PHP对接印度股票数据API实战指南
  • LeetCode 524.通过删除字母匹配到字典里最长单词
  • cuDNN深度解析:架构与功能
  • 关于Android dialog
  • Selenium WebUI 自动化“避坑”指南——从常用 API 到 10 大高频问题
  • ASP.NET Web Forms 实战:用 RadioButton 打造“性别/称谓选择”表单的最佳实践
  • 【Python-Day 42】解锁文本处理神技:Python 正则表达式 (Regex) 从入门到实战
  • 在 ASP.NET 8 WebAPI 中使用不同的提供程序验证多个令牌(Token)及常见问题解答
  • 前端开发基础必备——操作系统、计网、数据结构与算法编译原理
  • SpringBoot Web 入门指南:从零搭建第一个SpringBoot程序
  • [TryHackMe]Oh My WebServer(nday漏洞+容器逃逸)
  • Archlinux KDE 下 Fcitx5 输入法的配置与美化
  • 重新测试所有AI代码生成器(2025年更新):GPT-5 vs Claude 4.1 vs Gemini 2.5 Pro——为何“赢家”仍取决于你的技术栈
  • 一文掌握Redisson分布式锁
  • 天然苏打水生产的原水抽取与三重除菌的3D模拟开发实战
  • 编辑器vim(Linux)
  • Chrome 插件开发入门:从基础到实践
  • 美团龙猫AI修正的二分法提取xlsx的sheet.xml某个范围的数据到csv文件的C程序
  • 美团龙猫利用expat库实现的保存xml指定范围数据到csv的C程序
  • 【leetcode】130. 被围绕的区域