目录结构
对应 Laravel 的"目录结构"章节,以 PHP 开发者视角理解 Spring Boot 项目的文件布局。
核心概念对照
| Laravel | Spring Boot | 说明 |
|---|---|---|
app/ | src/main/java | 业务代码目录 |
config/ | src/main/resources | 配置文件目录 |
database/migrations/ | src/main/resources/db/migration | 数据库迁移 |
routes/ | 控制器注解中定义 | 路由定义位置 |
resources/views/ | src/main/resources/templates/ | 模板文件 |
public/ | src/main/resources/static/ | 静态资源 |
composer.json | pom.xml | 依赖声明 |
.env | application.yml | 配置文件 |
标准目录结构全览
my-app/
├── pom.xml # 类比 composer.json,依赖与构建配置
├── src/
│ ├── main/
│ │ ├── java/ # 类比 app/,所有业务代码放这里
│ │ │ └── com/
│ │ │ └── example/
│ │ │ └── myapp/
│ │ │ ├── MyApplication.java # 入口(类比 bootstrap/app.php + public/index.php)
│ │ │ ├── controller/ # 类比 app/Http/Controllers/
│ │ │ │ └── UserController.java
│ │ │ ├── service/ # 类比 app/Services/(需要手动创建)
│ │ │ │ └── UserService.java
│ │ │ ├── repository/ # 类比 app/Repositories/(需要手动创建)
│ │ │ │ └── UserRepository.java
│ │ │ ├── model/ # 类比 app/Models/
│ │ │ │ └── User.java
│ │ │ ├── dto/ # 类比 app/DTO/(数据传输对象)
│ │ │ │ └── UserRequest.java
│ │ │ └── config/ # 类比 app/Config/(Java 配置类)
│ │ │ └── SecurityConfig.java
│ │ └── resources/ # 类比 resources/ + config/
│ │ ├── application.yml # 类比 .env + 配置
│ │ ├── application-dev.yml # 类比 .env.local
│ │ ├── static/ # 类比 public/(CSS/JS/图片)
│ │ ├── templates/ # 类比 resources/views/(Thymeleaf 模板)
│ │ └── db/
│ │ └── migration/ # 类比 database/migrations/
│ │ └── V1__create_users_table.sql
│ └── test/ # 类比 tests/
│ └── java/
│ └── com/
│ └── example/
│ └── myapp/
│ └── UserControllerTest.java各目录详解(按 Laravel 对照)
pom.xml → composer.json
<!-- Maven 构建描述文件,Composer 开发者看这一块 -->
<groupId>com.example</groupId> <!-- 类比 "vendor/name",包的唯一标识 -->
<artifactId>myapp</artifactId> <!-- 类比项目名 -->
<version>0.0.1-SNAPSHOT</version> <!-- 版本号 -->
<dependencies>
<!-- 每个 <dependency> 对应 composer.json 中的一个包 -->
</dependencies>src/main/java/ → app/
这是最核心的区别。在 Laravel 中,你的业务代码放在 app/ 下,按功能分子目录。在 Spring Boot 中:
// 包路径:com.example.myapp
// 对应目录:src/main/java/com/example/myapp/包路径的命名规则为 com.公司名.项目名,对应三层目录深度。这不是强制规则,只是 Java 社区的约定俗成。
分层架构(类比 Laravel 的目录组织)
| 层 | 对应 Laravel | 职责 |
|---|---|---|
controller/ | app/Http/Controllers/ | 接收 HTTP 请求,调用业务逻辑 |
service/ | app/Services/ | 业务逻辑层 |
repository/ | app/Repositories/ | 数据访问层(可选,与 ORM 配合) |
model/ | app/Models/ | 数据实体 |
dto/ | 无直接对应(手动创建) | 请求/响应数据结构 |
config/ | app/Config/ | Java 配置类(替代 XML 配置) |
💡 关键差异: Laravel 倾向于将路由、控制器、模型等按"功能模块"直观组织;而 Spring Boot 遵循严格的分层架构,按"技术职责"分层。一个典型的"用户模块"会散落在 controller、service、model 等多个包中。
与 Laravel 的目录对比表
| Laravel | Spring Boot | 说明 |
|---|---|---|
app/Http/Controllers/UserController.php | controller/UserController.java | 控制器位置 |
app/Models/User.php | model/User.java | 模型位置 |
app/Services/UserService.php | service/UserService.java | 服务层 |
app/Providers/AppServiceProvider.php | 自动配置 + config/*.java | 服务提供者 |
resources/views/welcome.blade.php | templates/welcome.html | 视图模板 |
public/css/app.css | static/css/app.css | 静态文件 |
database/migrations/xxx_create_users_table.php | db/migration/V1__create_users_table.sql | 数据库迁移 |
routes/web.php | 控制器或专门的 WebConfig.java 中定义 | 路由定义 |
bootstrap/app.php | MyApplication.java | 应用入口 |
.env | application.yml | 配置文件 |
vendor/ | .m2/repository/ (Maven 本地缓存) | 依赖缓存目录 |
storage/logs/laravel.log | logs/spring.log | 日志文件 |
包命名规范(PHP 命名空间的 Java 对等概念)
// Laravel / PHP
namespace App\Http\Controllers; // 目录:app/Http/Controllers/// Spring Boot
package com.example.myapp.controller; // 目录:src/main/java/com/example/myapp/controller/规则:
- 包名全小写,使用
.分隔(PHP 用\分隔) - 通常以域名倒序开头:
com.github.项目名、org.apache.项目名 - 目录深度必须与包名完全一致
- PHP 可以自由组织目录结构,Java 强制包名与目录结构一一对应
总结:PHP 开发者踩坑提醒
目录就是包名:在 Java 中,
com.example.myapp.controller这个目录路径是强制的。你无法像 PHP 那样把UserController.php放在任意位置然后通过use导入。入口文件位置:
MyApplication.java必须放在所有业务包的最顶层包中(即com.example.myapp而非com.example.myapp.controller),因为 Spring Boot 会扫描入口文件所在包及其子包。没有 vendor 目录:Maven 的依赖下载到
~/.m2/repository/(用户家目录的 .m2 文件夹),不在项目目录内。pom.xml声明的依赖会自动下载到这个全局缓存。需要手动建目录:
service/、repository/、dto/等目录不是框架强制创建的,而是社区约定。如果发现目录不存在,手动创建即可,无需php artisan make系列命令。一个文件一个类:Java 要求一个
.java文件只能包含一个public class(内部类除外),且文件名必须与类名完全一致。不存在 PHP 中一个文件多个类的写法。