Flaviu Cicio 2024-01-08
1. 概述
在构建新的 Spring Boot 项目时,我们在组织类的方式上具有很高的灵活性。
尽管如此,仍有一些推荐的最佳实践需要牢记。
2. 避免使用默认包
由于 Spring Boot 的注解(如 @ComponentScan、@EntityScan、@ConfigurationPropertiesScan 和 @SpringBootApplication)依赖包路径来定义扫描位置,因此建议避免使用默认包(即不声明包名)。
我们应该始终为类显式声明包名。
3. 主启动类
@SpringBootApplication 注解会自动扫描当前包及其子包中的组件。因此,一个稳妥的做法是将项目的主启动类放在**根包(base package)**中。
虽然也可以通过手动指定基础包路径将主类放在其他位置,例如:
@SpringBootApplication(scanBasePackages = "example.baeldung.com")
@EnableJpaRepositories("example.baeldung.com")
@EntityScan("example.baeldung.com")
但大多数情况下,将主类置于根包是最简单且清晰的选择。
此外,请注意:在基于 JPA 的项目中,可能还需要在主类上添加额外的注解(如上所示),并进行一些额外配置。
4. 包结构设计
包结构的设计本身与 Spring Boot 无关,而应由项目的实际需求决定。
一种广受欢迎的策略是 按功能划分包(package-by-feature),这种方式能增强模块化,并允许在子包内部使用包私有(package-private)的可见性。
以 PetClinic 项目为例——这是 Spring 团队开发的一个示例项目,用于展示他们对典型 Spring Boot 项目结构的理解。
该项目采用按功能划分包的结构。其主包为 org.springframework.samples.petclinic,并包含以下五个子包:
org.springframework.samples.petclinic.modelorg.springframework.samples.petclinic.ownerorg.springframework.samples.petclinic.systemorg.springframework.samples.petclinic.vetorg.springframework.samples.petclinic.visit
每个子包代表应用程序的一个领域或功能模块,将高度耦合的类组织在一起,从而实现高内聚。
5. 结论
在本文中,我们探讨了构建 Spring Boot 项目时应牢记的一些推荐做法,并学习了如何设计合理的包结构。