知識庫 / Spring RSS 訂閱

Spring @EntityScan 與 @ComponentScan 的區別與用法

Spring
HongKong
5
12:41 PM · Dec 06 ,2025

1. 簡介

在編寫我們的 Spring 應用時,我們可能需要指定包含我們實體類的特定包列表。 同樣,在某些時候,我們只需要特定的 Spring Bean 被初始化。 這就是我們可以利用 <a href="https://docs.spring.io/spring-boot/docs/1.2.2.RELEASE/api/org/springframework/boot/orm/jpa/EntityScan.html"><em itemprop="name">@EntityScan</em></a > 或@ComponentScan 註解的地方。

為了澄清我們在此使用的術語,組件是帶有 <em itemprop="name">@Controller</em></a >, <em itemprop="name">@Service</em></a >, <em itemprop="name">@Repository</em></a >, <em itemprop="name">@Component</em></a >, <em itemprop="name">@Bean</em></a > 等註解的類。 實體類是標記帶有@Entity 註解的類。

在本簡短教程中,我們將討論 <em itemprop="name">@EntityScan</em></a > 和@ComponentScan 在 Spring 中的使用,解釋它們的作用,然後指出它們之間的差異。

2. <em @EntityScan</em> 註解

當編寫我們的 Spring 應用時,我們通常會包含實體類,這些類被 <em @Entity</em> 註解標記。我們可以採用兩種方法來放置我們的實體類:

  • 在應用程序的主包或其子包下
  • 使用完全不同的根包

在第一個場景中,我們可以使用 <em @EnableAutoConfiguration</em> 來啓用 Spring 自動配置應用程序上下文。

在第二個場景中,我們將為應用程序提供有關這些包的查找信息。為此,我們將使用 <em @EntityScan</em>

<em @EntityScan</em> 註解用於實體類未放置在主應用程序包或其子包中時。在這種情況下,我們在主配置類中聲明包或包列表,位於 <em @EntityScan</em> 註解中。這將告訴 Spring 在我們的應用程序中查找實體:

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

我們應該意識到,使用@EntityScan會禁用 Spring Boot 自動配置掃描實體類。

3. nnotation

類似於 和實體,如果我們希望 Spring 只使用特定的 Bean 類,我們會使用 註解。 它會指向我們希望 Spring 初始化 Bean 類所在的特定位置

這個註解可以與或不與參數一起使用。 不與參數一起使用時,Spring 會掃描當前包及其子包;而與參數一起使用時,它會告訴 Spring 確切地在哪裏搜索包。

關於參數,我們可以提供要掃描的包列表(使用 參數),或者我們可以指定屬於它們的類,這些類也會被掃描(使用 參數)。

以下是 @ComponentScan 註解使用的示例:

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

4. @EntityScan@ComponentScan

這些註解的最終目的不同。

它們的一點相似之處在於,它們都為 Spring 應用的配置做出貢獻。 @EntityScan 用於指定我們要掃描哪些包以查找實體類。 另一方面,@ComponentScan 用於指定要掃描哪些包以查找 Spring Bean。

5. 結論

在本教程中,我們討論了 @EntityScan@ComponentScan 註解的使用,並指出了它們之間的差異。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.