SpringBoot的项目结构是怎么样的?

文摘   2024-11-26 11:18   山西  

今天咱们来聊聊 SpringBoot 项目的结构设计。作为 Java 程序员,看到一个陌生项目时,如果能快速梳理清楚代码结构和逻辑,那简直不要太爽。而企业项目一般都有一定的分层规范,这不仅是为了让代码井然有序,更是为了提高可维护性和扩展性。

先说下阿里巴巴《Java 开发手册》提到的分层思路:一个标准的项目会按照开放接口层、终端显示层、Web 层、Service 层、Manager 层、DAO 层和第三方服务这几个部分划分。看上去很抽象?别急,咱们一步步捋清楚。

在 SpringBoot 项目里,这些分层大致对应如下代码结构:

src/main/java
  └── com.example.project
       ├── controller
       ├── service
       ├── manager
       ├── dao
       ├── domain
       ├── config
       └── utils

开放接口层和 Web 层

开放接口层通常是项目的入口,负责定义 API。这层可以直接暴露接口,也可以封装成 HTTP 的 Controller 接口。比如,在 SpringBoot 项目中,controller 包就是这部分。

@RestController
@RequestMapping("/api/user")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping("/{id}")
    public ResponseEntity<UserDTO> getUserById(@PathVariable Long id) {
        UserDTO user = userService.getUserById(id);
        return ResponseEntity.ok(user);
    }
}

这个 Controller 的作用很简单:接受前端请求,调用业务逻辑层处理,最后返回结果。如果你加了网关或者过滤器,那它们通常会在这一层之前。

Service 层:专注业务逻辑

Service 层是具体的业务逻辑处理的地方。它跟 Manager 层协作完成任务,但不会关心底层数据来源或外部接口,只专注于自身的业务逻辑。

@Service
public class UserService {

    @Autowired
    private UserManager userManager;

    public UserDTO getUserById(Long id) {
        User user = userManager.findUserById(id);
        return convertToDTO(user);
    }

    private UserDTO convertToDTO(User user) {
        UserDTO dto = new UserDTO();
        dto.setId(user.getId());
        dto.setName(user.getName());
        return dto;
    }
}

这里的 UserService 就是一个典型的 Service 层,负责从 Manager 层获取数据,做一些业务逻辑处理后返回给 Controller。

Manager 层:通用业务处理

Manager 层的作用是什么?其实是解耦。它既对接 DAO 层,也对接第三方服务,帮 Service 层统一处理这些调用。

@Component
public class UserManager {

    @Autowired
    private UserRepository userRepository;

    public User findUserById(Long id) {
        return userRepository.findById(id).orElse(null);
    }
}

这里的 UserManager 不仅是 DAO 的简单调用代理,还可以对数据进行预处理或缓存操作。如果业务逻辑复杂,例如多个数据源合并、异步任务调度,Manager 层会显得特别有用。

DAO 层:直接操作数据库

DAO 层是与数据库打交道的地方,一般使用 Spring Data JPA、MyBatis 等技术实现。这里的代码关注点只有一个:数据的增删改查。

@Repository
public interface UserRepository extends JpaRepository<UserLong{
}

一个简单的 Repository 接口,通过 JPA 自动生成方法就可以操作数据库。具体的 SQL 则可以通过 @Query 或 MyBatis XML 配置。

终端显示层和第三方服务

终端显示层是用户直接接触的部分,比如前端页面、移动端显示等。它主要是负责渲染数据并展示给用户。对于我们后端开发来说,可能这层只涉及一些接口返回的模板处理。

而第三方服务层,则负责对接外部的服务,比如支付接口、高德地图 API 等。你可能会写一些封装类,把复杂的接口调用隐藏在 Manager 层之下:

@Component
public class PaymentService {

    public PaymentResult pay(Order order) {
        // 调用第三方支付接口
        return callPaymentAPI(order);
    }
}

分层的好处

有人可能会问,分这么多层是不是太复杂了?其实分层的最大好处就是解耦。每一层都专注于自己的职责,这样在需求变化或故障排查时,我们可以快速定位问题所在。

例如,如果数据查询出现问题,通常只需要检查 DAO 和 Manager 层;如果是业务规则的问题,重点就在 Service 层。如果接口调用性能差,那开放接口层的逻辑和外部服务封装部分则是排查的重点。

-END-


ok,今天先说到这,老规矩,给大家分享一份不错的副业资料,感兴趣的同学找我领取。

以上,就是今天的分享了,看完文章记得右下角给何老师点赞,也欢迎在评论区写下你的留言

程序媛山楂
5年+程序媛,专注于AI编程普及。本号主要分享AI编程、Chat账号、Chat教程、Sora教程、Suno AI、Sora账号、Sora提示词、AI换脸、AI绘画等,帮助解决各种AI疑难杂症。
 最新文章