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

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://www.xdnf.cn/news/20019.html

相关文章:

  • 硬件开发1-51单片机2-按键、中断
  • 域名不做网站使用,还需要备案吗
  • 这才是真正懂C/C++的人,写代码时怎么区分函数指针和指针函数?
  • Qt + windows + Linux+QtInstallerFramework打包教程
  • RabbitMQ相关知识
  • 基于 STM32N6-AI Image Classification 使用 git bash 命令行示例 LAT1552
  • 单片机点灯
  • 【C++上岸】C++常见面试题目--算法篇(第十八期)
  • 网络:tcp
  • 关于稳定币的一些问答
  • 封装一个redis获取并解析数据的工具类
  • FPGA学习笔记——SDR SDRAM简介
  • 【golang长途旅行第37站】Redis连接池
  • OCR 发票识别与验真接口:助力电子化发票新时代
  • 融云:当我们谈论 AI 重构业务时,我们到底在谈论什么
  • 【Android】SharedPreferences轻量级持久化存储
  • 【题解】洛谷P1776 宝物筛选 [单调队列优化多重背包]
  • C++----模板特化以及模板声明与定义分离问题
  • AT32网线拔插下,modbus tcp断线重连
  • Linux awk命令完全指南:从原理到实战,搞定文本处理难题
  • 【AI】人工智能 传统和现代 架构和算法的演变历史
  • windows安装谷歌浏览器地址
  • TypeScript `infer` 关键字详解(从概念到实战)
  • AGV 搬运小车路径规划:从地图构建到路径决策的技术全解析
  • 打通 Flutter 与原生状态管理:Android ViewModel 的运用
  • SpringBoot+PDF.js实现按需分片加载(包含可运行样例源码)
  • C++小游戏
  • 腾讯开源HunyuanWorld-Voyager突破性原生3D重建与视频扩散框架
  • 计算机大数据毕业设计选题:基于Spark+hadoop的全球香水市场趋势分析系统
  • 优思学院|5个为什么(5 Whys)分析法一文讲清楚