# `@Component` 与 `@Bean` 的区别解析
## 一、作用对象差异
- **`@Component`**
作用于类级别,直接标注在类上,声明该类需要被Spring自动管理。
```java
@Component
public class OrderService {
// 业务逻辑实现
}
二、适用场景区别
| 注解 | 核心适用场景 | 示例场景 |
|---|
@Component | 自定义业务类(可修改源代码) | 自定义Service、Controller类 |
@Bean | 第三方组件或复杂实例化逻辑 | 配置DataSource、RedisTemplate等 |
三、注册机制不同
-
@Component 注册方式
依赖Spring的组件扫描机制,自动发现并实例化标注类。
需确保类所在包被扫描路径包含(如@SpringBootApplication所在包)。
-
@Bean 注册方式
必须定义在@Configuration标注的配置类中,通过调用方法手动创建实例。
支持完全自定义实例化过程:
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(redisConnectionFactory());
template.setKeySerializer(new StringRedisSerializer());
return template;
}
}
四、Bean命名规则
-
@Component 命名
默认名称为类名首字母小写,可通过value属性自定义:
@Component("customOrderService")
public class OrderService { ... }
-
@Bean 命名
默认名称为方法名,可通过name属性自定义:
@Bean(name = "customOrderService")
public OrderService orderService() { ... }
五、核心区别总结表
| 对比维度 | @Component | @Bean |
|---|
| 作用级别 | 类级别 | 方法级别 |
| 灵活性 | 低(固定实例化逻辑) | 高(完全自定义创建过程) |
| 依赖配置 | 依赖组件扫描 | 依赖@Configuration配置类 |
| 典型使用场景 | 自定义业务组件 | 第三方组件集成、复杂配置 |