Bài viết này sẽ đi sâu vào cách @Component hoạt động, vai trò của nó trong việc tự động phát hiện và quản lý bean trong Spring IoC container, cùng với các annotation chuyên biệt khác.

Spring Component
Khi bạn đánh dấu một lớp bằng @Component, bạn đang báo hiệu cho Spring Framework rằng đây là một thành phần mà nó cần quản lý. Điều này có nghĩa là Spring sẽ tự động phát hiện lớp này, tạo ra một instance của nó và đưa vào IoC container.
Nó đặc biệt hữu ích khi bạn sử dụng cấu hình dựa trên annotation và tính năng quét classpath. Spring Framework cung cấp ba annotation chuyên biệt khác, cũng đều là phiên bản đặc thù của @Component, giúp bạn làm rõ hơn vai trò của từng lớp:
@Service: Annotation này cho biết lớp cung cấp các dịch vụ nghiệp vụ. Chúng ta thường đánh dấu các lớp tiện ích (utility classes) hoặc các lớp chứa logic nghiệp vụ cốt lõi bằng@Service.@Repository: Annotation này chỉ ra rằng lớp xử lý các thao tác CRUD (Create, Read, Update, Delete), thường được sử dụng với các triển khai DAO (Data Access Object) tương tác trực tiếp với cơ sở dữ liệu hoặc các nguồn dữ liệu khác.@Controller: Phần lớn được sử dụng trong các ứng dụng web hoặc các REST web service. Annotation này chỉ định rằng lớp là một bộ điều khiển phía frontend, chịu trách nhiệm xử lý các yêu cầu của người dùng và trả về phản hồi phù hợp.
Tất cả bốn annotation này đều nằm trong package org.springframework.stereotype và là một phần của thư viện spring-context. Điều quan trọng cần nhớ là @Service, @Repository, và @Controller thực chất là các annotation meta-annotated bằng @Component. Điều này có nghĩa là chúng kế thừa tất cả các hành vi của @Component nhưng cung cấp ngữ nghĩa rõ ràng hơn về vai trò của lớp trong kiến trúc ứng dụng.
Lưu ý rằng, trong hầu hết các trường hợp, các lớp component của bạn sẽ thuộc một trong ba loại chuyên biệt kia, vì vậy bạn có thể không sử dụng @Component trực tiếp quá nhiều.
Ví dụ về Spring Component
Để minh họa rõ hơn cách @Component hoạt động và cách Spring tự động phát hiện nó thông qua cấu hình dựa trên annotation và quét classpath, chúng ta hãy xây dựng một ứng dụng Spring Maven đơn giản.
Trước tiên, bạn cần thêm dependency spring-context vào file pom.xml của mình:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
Đó là tất cả những gì chúng ta cần để có được các tính năng cốt lõi của Spring Framework. Tiếp theo, hãy tạo một lớp component đơn giản và đánh dấu nó bằng @Component:
package com.journaldev.spring;
import org.springframework.stereotype.Component;
@Component
public class MathComponent {
public int add(int x, int y) {
return x + y;
}
}
Bây giờ, chúng ta sẽ tạo một ngữ cảnh Spring dựa trên annotation và lấy bean MathComponent từ đó:
package com.journaldev.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringMainClass {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.journaldev.spring");
context.refresh();
MathComponent ms = context.getBean(MathComponent.class);
int result = ms.add(1, 2);
System.out.println("Addition of 1 and 2 = " + result);
context.close();
}
}
Chỉ cần chạy lớp SpringMainClass như một ứng dụng Java thông thường, bạn sẽ thấy kết quả sau trong console:
Jun 05, 2018 12:49:26 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Tue Jun 05 12:49:26 IST 2018]; root of context hierarchy
Addition of 1 and 2 = 3
Jun 05, 2018 12:49:26 PM org.springframework.context.support.AbstractApplicationContext doClose
INFO: Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@ff5b51f: startup date [Tue Jun 05 12:49:26 IST 2018]; root of context hierarchy
Bạn có nhận ra sức mạnh của Spring không? Chúng ta không cần làm gì nhiều để Spring tự động quản lý component này. Hình ảnh bên dưới cho thấy cấu trúc thư mục của dự án Spring Component của chúng ta.

Chúng ta cũng có thể chỉ định tên cho component và lấy nó từ ngữ cảnh Spring bằng tên đó. Để làm điều này, bạn có thể truyền một chuỗi làm đối số cho annotation @Component:
@Component("mc")
public class MathComponent {
}
Và sau đó, bạn có thể truy xuất bean bằng tên:
MathComponent ms = (MathComponent) context.getBean("mc");
Mặc dù tôi đã sử dụng @Component cho MathComponent, thực tế đây là một lớp dịch vụ và chúng ta nên dùng @Service để biểu thị rõ ràng hơn vai trò của nó. Kết quả đầu ra vẫn sẽ tương tự.
Kết luận
Qua bài viết này, chúng ta đã cùng nhau khám phá sức mạnh và vai trò quan trọng của annotation @Component trong Spring Framework. Bạn đã hiểu rằng @Component cho phép Spring tự động phát hiện và quản lý các bean trong IoC container của nó, đặc biệt khi sử dụng cấu hình dựa trên annotation và quét classpath.
Việc nắm vững @Component và các annotation liên quan không chỉ giúp bạn xây dựng các ứng dụng Spring hiệu quả hơn mà còn tăng cường khả năng bảo trì và mở rộng của mã nguồn.