Tất cả đều là dạng chuyên biệt của @Component → đều được component scan và tạo bean. Khác nhau ở tầng mà annotation đánh dấu + 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) | Có — Exception translation |
@Controller | Web (trả view) | Có — Spring MVC handler |
@RestController | Web (REST API) | Có — @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ứ.