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 註解的使用,並指出了它們之間的差異。