一句话核心结论Component/Service/Controller扫描类本身把这个类直接作为Bean适合你自己写的业务代码类源码你能改。Configuration Bean通过方法返回对象来注册Bean适合你没法修改源码的第三方类或者需要复杂构造、动态创建对象的场景。注意Service/Controller本质都是Component的派生注解功能上一样只是语义区分。一、两种方式对比方式1Component家族组件扫描ServicepublicclassUserService{}原理Spring启动时包扫描扫描到标记注解的类自动实例化这个类放到IOC容器。✅ 优点简单一行注解搞定日常业务开发首选❌ 限制必须能修改这个类的源代码才能在类上加注解。如果这个类是第三方jar包里的比如RedisTemplate、RestTemplate、MyBatis的某些类你拿不到源码不可能去源码上加Component。方式2Configuration BeanConfigurationpublicclassAppConfig{BeanpublicRestTemplaterestTemplate(){// 可以自定义配置参数returnnewRestTemplate();}}原理Configuration标记这是配置类Spring会执行里面带Bean的方法把方法返回值注册成Bean。✅ 优点不需要修改目标类源码第三方类也能注册到容器创建Bean前可以写自定义逻辑设置参数、装配依赖、条件判断一个配置方法可以灵活控制实例创建过程❌ 缺点代码多一点二、什么时候必须用 Bean引入第三方组件最常见比如RestTemplate、RedisTemplate、线程池、连接池类在jar包中源码不能改无法加Component只能用Bean创建。Bean创建需要复杂初始化逻辑创建对象时要设置很多参数、调用初始化方法、根据配置文件动态选择实现类。BeanpublicDataSourcedataSource(){HikariConfigconfignewHikariConfig();config.setJdbcUrl(xxx);config.setMaximumPoolSize(20);returnnewHikariDataSource(config);}这种复杂构建直接Component很难实现。同一类型需要多个不同实例比如需要两个不同配置的线程池同一个类要生成多个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项目里一般是同时混用。