Spring @EntityScan與@ComponentScan

1.簡介

在編寫Spring應用程序時,我們可能需要指定包含實體類的特定軟件包列表。類似地,在某個時候,我們只需要初始化Spring Bean的特定列表即可。在這裡,我們可以使用@EntityScan@ComponentScan批註。

為了澄清我們在這裡使用的術語,組件是帶有@Controller @Bean, @Repository Service, @Service Repository, @Component Component,@Bean等註釋的類。實體是標有@Entity批註的類。

在這個簡短的教程中,我們將討論@EntityScan@ComponentScan在Spring中的用法,解釋它們的用途,然後指出它們之間的區別。

2. @EntityScan註釋

在編寫我們的Spring應用程序時,我們通常會有實體類-用@Entity註釋進行註釋的那些。我們可以考慮兩種放置實體類的方法:

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

在第一種情況下,我們可以使用@EnableAutoConfiguration啟用Spring以自動配置應用程序上下文。

在第二種情況下,我們將為我們的應用程序提供可以在何處找到這些軟件包的信息。為此,我們將使用@EntityScan.

當實體類未放置在主應用程序包或其子包中時,將使用@EntityScan @EntityScan批註中的主配置類中聲明該程序包或程序包列表。這將告訴Spring在哪裡可以找到我們的應用程序中使用的實體:

@Configuration

 @EntityScan("com.baeldung.demopackage")

 public class EntityScanDemo {

 // ...

 }

我們應該知道,使用@EntityScan將禁用對實體的Spring Boot自動配置掃描。

3. @ComponentScan A註解

@EntityScan和實體類似,如果我們希望Spring僅使用一組特定的Bean類,則可以使用@ComponentScan批註。它將指向我們希望Spring初始化的bean類的特定位置

該註釋可以與參數一起使用,也可以不與參數一起使用。如果沒有參數,Spring將掃描當前軟件包及其子軟件包,而在進行參數化時,它將告訴Spring確切的位置搜索軟件包。

關於參數,我們可以提供要掃描的軟件包的列表(使用basePackages參數),也可以命名特定的類,在這些類中,它們所屬的軟件包也將被掃描(使用basePackageClasses參數)。

讓我們看一個@ComponentScan註釋用法的示例:

@Configuration

 @ComponentScan(

 basePackages = {"com.baeldung.demopackage"},

 basePackageClasses = DemoBean.class)

 public class ComponentScanExample {

 // ...

 }

4. @EntityScan@ComponentScan

最後,我們可以說這兩個註釋的目的完全不同。

它們的相似之處在於它們都對我們的Spring應用程序配置有所幫助。 @EntityScan應該指定我們要掃描哪些程序包以查找實體類。另一方面,在指定應為Spring Bean掃描哪些軟件包時@ComponentScan

5.結論

在這個簡短的教程中,我們討論了@EntityScan@ComponentScan批註的用法,並指出了它們的區別。