@Component | @Bean | |
|---|---|---|
| Đặt ở | Class | Method trong @Configuration class |
| Tạo bean | Spring tự new qua default constructor | Method trả về object |
| Kiểm soát logic init | Hạn chế | Linh hoạt — viết logic tuỳ ý |
| Discovery | Component scan | Khai báo tường minh |
java
// @Component — class của bạn
@Service
class UserService { /* ... */ }
// @Bean — cần khi class của thư viện ngoài hoặc init phức tạp
@Configuration
class AppConfig {
@Bean
RestTemplate restTemplate() {
return new RestTemplateBuilder()
.setConnectTimeout(Duration.ofSeconds(5))
.build();
}
@Bean
@ConditionalOnProperty("cache.enabled")
Cache cache() { return new Cache(...); }
}Khi dùng @Bean:
- Thư viện third-party (không thêm @Component được vào source bên ngoài).
- Init phức tạp / cần config.
- Conditional bean (@ConditionalOnProperty, @ConditionalOnMissingBean).
- Cần nhiều instance khác nhau của cùng class.
Khi dùng @Component: class trong app của bạn, init đơn giản.
Cả 2 mặc định singleton scope.
@Component | @Bean | |
|---|---|---|
| Placed on | Class | Method in a @Configuration class |
| How bean is created | Spring news it via default constructor | The method returns the object |
| Control over init | Limited | Flexible — arbitrary logic |
| Discovery | Component scan | Explicit declaration |
java
// @Component — your own class
@Service
class UserService { /* ... */ }
// @Bean — needed for third-party classes or complex init
@Configuration
class AppConfig {
@Bean
RestTemplate restTemplate() {
return new RestTemplateBuilder()
.setConnectTimeout(Duration.ofSeconds(5))
.build();
}
@Bean
@ConditionalOnProperty("cache.enabled")
Cache cache() { return new Cache(...); }
}Use @Bean when:
- Third-party libraries (cannot add @Component to external source).
- Complex initialization / configuration.
- Conditional beans (@ConditionalOnProperty, @ConditionalOnMissingBean).
- Multiple distinct instances of the same class.
Use @Component when: classes in your own app with simple init.
Both default to singleton scope.