Skip to content

目录结构

对应 Laravel 的"目录结构"章节,以 PHP 开发者视角理解 Spring Boot 项目的文件布局。


核心概念对照

LaravelSpring 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.jsonpom.xml依赖声明
.envapplication.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.xmlcomposer.json

xml
<!-- 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 中:

java
// 包路径: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 的目录对比表

LaravelSpring Boot说明
app/Http/Controllers/UserController.phpcontroller/UserController.java控制器位置
app/Models/User.phpmodel/User.java模型位置
app/Services/UserService.phpservice/UserService.java服务层
app/Providers/AppServiceProvider.php自动配置 + config/*.java服务提供者
resources/views/welcome.blade.phptemplates/welcome.html视图模板
public/css/app.cssstatic/css/app.css静态文件
database/migrations/xxx_create_users_table.phpdb/migration/V1__create_users_table.sql数据库迁移
routes/web.php控制器或专门的 WebConfig.java 中定义路由定义
bootstrap/app.phpMyApplication.java应用入口
.envapplication.yml配置文件
vendor/.m2/repository/ (Maven 本地缓存)依赖缓存目录
storage/logs/laravel.loglogs/spring.log日志文件

包命名规范(PHP 命名空间的 Java 对等概念)

php
// Laravel / PHP
namespace App\Http\Controllers;  // 目录:app/Http/Controllers/
java
// Spring Boot
package com.example.myapp.controller;  // 目录:src/main/java/com/example/myapp/controller/

规则:

  1. 包名全小写,使用 . 分隔(PHP 用 \ 分隔)
  2. 通常以域名倒序开头:com.github.项目名org.apache.项目名
  3. 目录深度必须与包名完全一致
  4. PHP 可以自由组织目录结构,Java 强制包名与目录结构一一对应

总结:PHP 开发者踩坑提醒

  1. 目录就是包名:在 Java 中,com.example.myapp.controller 这个目录路径是强制的。你无法像 PHP 那样把 UserController.php 放在任意位置然后通过 use 导入。

  2. 入口文件位置MyApplication.java 必须放在所有业务包的最顶层包中(即 com.example.myapp 而非 com.example.myapp.controller),因为 Spring Boot 会扫描入口文件所在包及其子包。

  3. 没有 vendor 目录:Maven 的依赖下载到 ~/.m2/repository/(用户家目录的 .m2 文件夹),不在项目目录内。pom.xml 声明的依赖会自动下载到这个全局缓存。

  4. 需要手动建目录service/repository/dto/ 等目录不是框架强制创建的,而是社区约定。如果发现目录不存在,手动创建即可,无需 php artisan make 系列命令。

  5. 一个文件一个类:Java 要求一个 .java 文件只能包含一个 public class(内部类除外),且文件名必须与类名完全一致。不存在 PHP 中一个文件多个类的写法。

面向 PHP 开发者的 Spring Boot 文档