07.结构化代码

Spring Boot 不需要任何特定的代码布局就可以工作。 然而,有一些最佳实践可以帮助你。

使用默认package

当一个类不包含 package 声明时,它被认为是在“默认包”中。 通常不鼓励使用“默认包” ,并且应该避免使用。 对于使用 @ComponentScan@configurationPropertiesScan@EntityScan@SpringBootApplication 注解的 Spring Boot 应用程序,它可能会导致特殊的问题,因为每个 jar 的每个类都会被读取。

建议您遵循 Java 推荐的包命名约定,并使用反向域名,例如 com.example.project

定位主程序类

我们通常建议您将主程序类定位在根包中,位于其他类之上。 @SpringBootApplication 注解通常放在您的主类上,它隐式地为某些项定义一个基本的“搜索包”。 例如,如果您正在编写一个 JPA 应用程序,可以使用 @SpringBootApplication 注解类的包来搜索@Entity 项。 使用根包还允许组件扫描只应用于项目。

如果你不想使用 @SpringBootApplication@EnableAutoConfiguration@ComponentScan 注解提供了相同和功能,可以使用这两个注解来代替 @SpringBootApplication

下面显示了一个典型的布局:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
com
+- example
+- myapplication
+- Application.java
|
+- customer
| +- Customer.java
| +- CustomerController.java
| +- CustomerService.java
| +- CustomerRepository.java
|
+- order
+- Order.java
+- OrderController.java
+- OrderService.java
+- OrderRepository.java

Application.java 文件声明了一个 main 方法和 @SpringBootApplication ,如下所示:

1
2
3
4
5
6
7
8
9
10
11
12
13
package com.example.myapplication;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}

}

总结

全篇的意思就是:在SpringBoot应用中不要使用无package声明的类,不然可能会导致SpringBoot应用启动时无法扫描到这些类;SpringBoot的主类要放在最外层的包目录下,其他模块在该包下再创建子包。