Spring Boot Bean 注册的两种方式:@Component 家族 vs @Configuration + @Bean

一句话核心结论

@Component/@Service/@Controller:扫描类本身,把这个类直接作为Bean ,适合你自己写的业务代码,类源码你能改。

@Configuration + @Bean:通过方法返回对象来注册Bean ,适合你没法修改源码 的第三方类,或者需要复杂构造、动态创建对象的场景。

注意:@Service/@Controller本质都是@Component的派生注解,功能上一样,只是语义区分。

一、两种方式对比

方式1:@Component家族(组件扫描)

java 复制代码
@Service
public class UserService {
}
  • 原理:Spring启动时包扫描,扫描到标记注解的类,自动实例化这个类,放到IOC容器。
    ✅ 优点:简单,一行注解搞定,日常业务开发首选
    ❌ 限制:必须能修改这个类的源代码,才能在类上加注解。

如果这个类是第三方jar包里的(比如RedisTemplate、RestTemplate、MyBatis的某些类),你拿不到源码,不可能去源码上加@Component。

方式2:@Configuration + @Bean

java 复制代码
@Configuration
public class AppConfig {
    @Bean
    public RestTemplate restTemplate(){
        // 可以自定义配置参数
        return new RestTemplate();
    }
}
  • 原理:@Configuration标记这是配置类,Spring会执行里面带@Bean的方法,把方法返回值注册成Bean 。
    ✅ 优点:
  1. 不需要修改目标类源码,第三方类也能注册到容器
  2. 创建Bean前可以写自定义逻辑:设置参数、装配依赖、条件判断
  3. 一个配置方法可以灵活控制实例创建过程
    ❌ 缺点:代码多一点

二、什么时候必须用 @Bean

  1. 引入第三方组件(最常见)

    比如 RestTemplate、RedisTemplate、线程池、连接池,类在jar包中,源码不能改,无法加@Component,只能用@Bean创建。

  2. Bean创建需要复杂初始化逻辑

    创建对象时要设置很多参数、调用初始化方法、根据配置文件动态选择实现类。

java 复制代码
@Bean
public DataSource dataSource(){
    HikariConfig config = new HikariConfig();
    config.setJdbcUrl("xxx");
    config.setMaximumPoolSize(20);
    return new HikariDataSource(config);
}

这种复杂构建,直接@Component很难实现。

  1. 同一类型,需要多个不同实例
    比如需要两个不同配置的线程池,同一个类要生成多个Bean,用@Component只能一个,@Bean可以写多个方法,配合@Qualifier区分。

三、什么时候优先用 @Component / @Service / @Controller

  • 自己开发的业务类:Service、Controller、Mapper
  • 对象创建逻辑简单:无特殊构造参数,直接new就可以使用

四、补充一个容易踩坑点:@Configuration 的 Full模式

@Configuration 默认Full模式,会对@Bean方法做CGLIB代理。

配置类里面多个@Bean方法互相调用时,不会重复new对象,会直接从容器拿单例Bean。

如果写成 @Configuration(proxyBeanMethods = false)(轻量模式),就不会代理,内部方法调用会生成新对象。

五、极简总结

  • 自己写的代码,源码可控 → @Component系列,简单省事
  • 第三方类 / 复杂对象构建 / 多实例 → @Configuration + @Bean

两者不是替代关系,是互补关系,SpringBoot项目里一般是同时混用。

相关推荐
张彦峰ZYF1 小时前
停顿短不等于延迟低:G1、ZGC 与低延迟服务的目标分野、代价账本与选型标定
后端·回收暂停、应用停止总时长·到达安全点、分配停滞·屏障吃吞吐、并发线程吃核心·并发窗口吃堆余量·分区式靠挑回收集兑现目标·染色指针式不支持压缩引用
silvamux_1 小时前
curl 测试 OpenAI 兼容 API 的完整流程
java·人工智能·缓存·ai·oneapi
pride.li2 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
省钱兄--zs2 小时前
深圳24小时自助健身房软硬件解决方案实战指南与开发流程详解
java·数据仓库·spring boot·小程序·架构
顽疲2 小时前
Java vue 养老系统源码详解:月账单 care_month_bill 与 Quartz 扣费 Job 实践
java·开发语言·vue.js·vue养老·springboot养老·java养老
Wang's Blog2 小时前
Java 项目实战: 交友项目 - 安装开发工具与环境准备
java·开发语言·交友
upala2 小时前
【仓颉语言入门 · 第二篇 第 6 课】
后端
罗丹丹Luna2 小时前
移动端显示“已提交”以后:SAP 与低代码集成该怎样暴露真实状态
后端·架构
用户21296835261682 小时前
开源了一个 Java 多智能体 LLM 框架 Baton:一个依赖,把 Agent 循环、工具调用、记忆、编排全配齐
java·llm