1.Giới thiệu

Khi viết ứng dụng Spring, chúng ta có thể cần chỉ định một danh sách các gói nhất định chứa các lớp thực thể của chúng ta. Tương tự, tại một số thời điểm, chúng ta sẽ chỉ cần một danh sách cụ thể các Spring Bean của mình để được khởi tạo. Đây là nơi chúng ta có thể sử dụng các chú thích @EntityScan hoặc @ComponentScan .

Để làm rõ các thuật ngữ chúng ta sử dụng ở đây, các thành phần là các lớp có chú thích @Controller , @Service , @Repository , @Component , @Bean , v.v. Thực thể là các lớp được đánh dấu bằng chú thích @Entity .

Trong hướng dẫn ngắn này, chúng ta sẽ thảo luận về cách sử dụng @EntityScan và @ComponentScan trong Spring, giải thích chúng được dùng để làm gì và sau đó chỉ ra sự khác biệt của chúng.

2. @EntityScan

Khi viết ứng dụng Spring, chúng ta thường sẽ có các lớp thực thể – những lớp được chú thích bằng chú thích @Entity . Chúng ta có thể xem xét hai cách tiếp cận để đặt các lớp thực thể của mình:

  • Trong gói chính của ứng dụng hoặc các gói phụ của nó
  • Sử dụng gói gốc hoàn toàn khác

Trong trường hợp đầu tiên, chúng ta có thể sử dụng @EnableAutoConfiguration để kích hoạt Spring tự động định cấu hình ngữ cảnh ứng dụng.

Trong trường hợp thứ hai, chúng tôi sẽ cung cấp cho ứng dụng của mình thông tin về nơi có thể tìm thấy các gói này. Với mục đích này, chúng tôi sẽ sử dụng @EntityScan.

Chú ý: @EntityScan được sử dụng khi các lớp thực thể không được đặt trong gói ứng dụng chính hoặc các gói phụ của nó. Trong tình huống này, chúng tôi sẽ khai báo gói hoặc danh sách các gói trong lớp cấu hình chính trong chú thích @EntityScan . Điều này sẽ cho Spring biết nơi tìm các thực thể được sử dụng trong ứng dụng của chúng ta:

@Configuration
@EntityScan("com.baeldung.demopackage")
public class EntityScanDemo {
    // ...
}

Lưu ý: Việc sử dụng @EntityScan sẽ vô hiệu hóa tính năng quét cấu hình tự động của Spring Boot đối với các thực thể.

3. @ComponentScan

Tương tự như @EntityScan và các thực thể, nếu chúng ta muốn Spring chỉ sử dụng một tập hợp các lớp Bean cụ thể, chúng ta sẽ sử dụng chú thích @ComponentScan . Nó sẽ trỏ đến vị trí cụ thể của các lớp Bean mà chúng ta muốn Spring khởi tạo .

Chú thích này có thể được sử dụng có hoặc không có tham số. Nếu không có tham số, Spring sẽ quét gói hiện tại và các gói con của nó, đồng thời, khi được tham số hóa, nó sẽ cho Spring biết chính xác nơi tìm kiếm gói.

Liên quan đến các tham số, chúng ta có thể cung cấp danh sách các gói sẽ được quét (sử dụng tham số basePackages ) hoặc chúng tacó thể đặt tên cho các lớp cụ thể trong đó các gói thuộc về chúng cũng sẽ được quét (sử dụng tham số basePackageClasses ).

Hãy xem ví dụ về cách sử dụng chú thích @ComponentScan:

@Configuration
@ComponentScan(
  basePackages = {"com.baeldung.demopackage"}, 
  basePackageClasses = DemoBean.class)
public class ComponentScanExample {
    // ...
}

4. @EntityScan vs @ComponentScan

Cuối cùng, chúng ta có thể nói rằng hai chú thích này nhằm mục đích hoàn toàn khác nhau.

Điểm giống nhau của chúng là đều đóng góp vào cấu hình ứng dụng Spring của chúng ta. @EntityScan nên chỉ định gói nào chúng ta muốn quét để tìm các lớp thực thể. Mặt khác, @ComponentScan là một lựa chọn khi chỉ định gói nào sẽ được quét để tìm Spring Bean.

5. Kết luận

Trong hướng dẫn ngắn này, chúng ta đã thảo luận về cách sử dụng chú thích @EntityScan và @ComponentScan , đồng thời chỉ ra sự khác biệt của chúng.
Link bài viết tham khảo