Tất cả là chuyên biệt hóa của @Component → đều được component scan và tạo bean. Khác nhau ở ngữ nghĩa tầng + tính năng thêm:
| Annotation | Tầng | Tính năng thêm |
|---|---|---|
@Component | Generic | Không |
@Service | Business logic | Không |
@Repository | Data access (DAO) | ✅ Exception translation |
@Controller | Web (trả view) | ✅ Spring MVC handler |
@RestController | Web (REST API) | ✅ @ResponseBody mặc định |
Exception translation của @Repository: Spring tự convert exception DB (SQLException, HibernateException...) → DataAccessException (unchecked, đồng nhất) — caller không cần biết DB backend là gì.
Best practice: dùng đúng annotation theo tầng — code tự nói lên kiến trúc (đọc @Service biết ngay là business logic) + hưởng tính năng tương ứng. Đừng dùng @Component cho mọi thứ.