Spring普通配置类 vs 自动配置类-笔记

1.简要版

@Configuration和@Bean,既可以用于普通配置类,也可以用于自动配置类。二者的区别和联系是什么呢?

区别:

  • @Configuration和@Bean是Spring框架本身的注解,用于定义配置类和生成Bean。
  • 而自动配置通常是Spring Boot的概念,比如通过@EnableAutoConfiguration和条件注解来实现的。

联系:

  • 自动配置类本质上也是普通配置类,只是:
    • 被 Spring Boot 自动加载
    • 使用了条件注解控制 Bean 的创建
  • 普通配置类可以覆盖自动配置类的 Bean,例如通过 @Primary 或在 application.properties 中设置属性来改变默认行为。

2.详情版

2.1 基本定义

类型 定义
普通配置类 使用 @Configuration 注解的类,内部通过 @Bean 方法显式定义 Bean。这类配置类是开发者手动编写的,用于构建应用所需的依赖关系。
自动配置类 是 Spring Boot 提供的一种特殊配置类,通常也使用 @Configuration@Bean,但结合了 条件注解(如 @ConditionalOnClass@ConditionalOnMissingBean 等) ,由 Spring Boot 在启动时 自动加载并按需启用

2.2 加载机制

项目 普通配置类 自动配置类
加载方式 显式声明:通过组件扫描(@ComponentScan)或 @Import 加载 隐式加载:由 @EnableAutoConfiguration 触发,从 spring.factories 或自动配置元数据中读取
控制权 完全由开发者控制 由 Spring Boot 根据环境自动判断是否启用
是否可覆盖 可以被覆盖或替换 通常不可覆盖,除非手动定义相同 Bean 并设置为优先级更高

2.3 条件化配置

项目 普通配置类 自动配置类
是否支持条件化 不支持 支持多种条件注解(如 @ConditionalOnClass, @ConditionalOnProperty 等)
目的 用于显式创建 Bean 用于按需启用/禁用配置,实现"智能配置"

⚠️ 自动配置类的核心优势在于其"条件化"能力。它可以根据类路径、配置属性、已注册的 Bean 等条件,决定是否启用某个配置或创建某个 Bean。


2.4 使用场景

类型 适用场景
普通配置类 开发者手动定义的 Bean、自定义组件、业务逻辑相关的配置等
自动配置类 用于 Spring Boot 内部或第三方库提供的默认配置,如数据库连接、Web 容器、邮件服务等

2.5 两者的关系

  • 自动配置类本质上也是普通配置类 ,只是:
    • 被 Spring Boot 自动加载
    • 使用了条件注解控制 Bean 的创建
  • 普通配置类可以覆盖自动配置类的 Bean ,例如通过 @Primary 或在 application.properties 中设置属性来改变默认行为。

2.6 示例对比

**1. 普通配置类:**该类需要被组件扫描或显式导入,才能生效。

java 复制代码
@Configuration
public class MyConfig {
    @Bean
    public MailService mailService() {
        return new MailServiceImpl();
    }
}

2. 自动配置类: 该类只有当 javax.mail.Session 存在,且未手动注册 MailService 时才会生效。

java 复制代码
@Configuration
@ConditionalOnClass(Session.class)
public class MailAutoConfiguration {

    @Bean
    @ConditionalOnMissingBean(MailService.class)
    public MailService mailService() {
        return new MailServiceImpl();
    }
}

2.7 使用建议

场景 建议
自定义 Bean 使用普通配置类
第三方库集成 使用自动配置类(由库提供者定义)
修改默认配置 使用普通配置类覆盖自动配置类的 Bean
自定义自动配置 实现 @Configuration + 条件注解,注册到 spring.factories

2.8 总结

项目 普通配置类 自动配置类
是否自动加载 是(Spring Boot 控制)
是否支持条件判断
是否可被覆盖 通常不可直接覆盖
适用场景 自定义逻辑、显式配置 自动化配置、默认行为

通过合理使用这两类配置方式,可以更高效地构建灵活、可扩展的 Spring 应用。普通配置类用于构建自己的业务逻辑,而自动配置类则帮助我们快速集成第三方库和基础设施,减少重复配置工作。

3.相关文档

SpringBoot的自动配置功能-笔记-CSDN博客

Spring中生成Bean的方式总结-笔记-CSDN博客

相关推荐
charlie11451419111 分钟前
现代 Python 学习笔记:Statements & Syntax
笔记·python·学习·教程·基础·现代python·python3.13
oDeviloo1 小时前
新版IntelliJ IDEA个性化设置兼容老版习惯
java·ide·intellij-idea
一只小透明啊啊啊啊1 小时前
Java Web 开发的核心组件:Servlet, JSP,Filter,Listener
java·前端·servlet
spencer_tseng2 小时前
Eclipse Uninstall Software
java·ide·eclipse
嗯、.2 小时前
使用 iText 9 为 PDF 添加文字水印的完整实战
java·pdf·itext
怪兽20143 小时前
缓存雪崩、缓存穿透、缓存预热、缓存更新、缓存降级等问题
java·缓存·面试
皮皮林5513 小时前
Java 25 正式发布:更简洁、更高效、更现代!
java
源码_V_saaskw3 小时前
JAVA国际版二手交易系统手机回收好物回收发布闲置商品系统源码支持APP+H5
java·开发语言·微信·智能手机·微信小程序·小程序
جيون داد ناالام ميづ4 小时前
Spring AOP核心原理分析
java·数据库·spring
霸道流氓气质4 小时前
SpringBoot+MybatisPlus+自定义注解+切面实现水平数据隔离功能(附代码下载)
java·spring boot·后端