Spring @EntityScan與@ComponentScan
- Spring
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
批註的用法,並指出了它們的區別。