spring boot 标准企业分层规范(SpringBoot + Spring Data JPA)

 

 

标准分层流向(必须遵守)

Controller(控制层) → Service接口 → ServiceImpl实现类 → Repository(DAO) → Entity实体
规范铁律:
  1. Controller 禁止直接调用 Repository
  2. 业务逻辑全部写在 ServiceImpl
  3. Repository 只做数据库操作,不写业务
  4. 优先使用构造器注入(不推荐字段 @Autowired)

完整包结构(对照视频 jobportal 项目)

plaintext
 
 
com.eazybytes.jobportal
├─ JobportalApplication   // 启动类
├─ entity                 // 数据库实体
│   └─ Company.java
├─ repository             // SpringData仓库接口
│   └─ CompanyRepository.java
├─ service
│   ├─ ICompanyService.java    // Service接口
│   └─ impl
│       └─ CompanyServiceImpl.java // Service实现类
└─ controller
    └─ CompanyController.java
 

二、每一层完整正规代码

1. Entity 实体 com.eazybytes.jobportal.entity.Company

java
 
运行
 
 
package com.eazybytes.jobportal.entity;

import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Entity
@Table(name = "company")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Company {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;
    private String name;
    private String description;
}
 

 

2. Repository com.eazybytes.jobportal.repository.CompanyRepository

java
 
运行
 
 
package com.eazybytes.jobportal.repository;

import com.eazybytes.jobportal.entity.Company;
import org.springframework.data.jpa.repository.JpaRepository;

// 只负责数据库CRUD,不写业务!
public interface CompanyRepository extends JpaRepository<Company, Integer> {
    // 需要额外查询方法在这里定义
}
 

 

3. Service 接口 com.eazybytes.jobportal.service.ICompanyService

java
 
运行
 
 
package com.eazybytes.jobportal.service;

import com.eazybytes.jobportal.entity.Company;
import java.util.List;

// 定义对外暴露的业务方法
public interface ICompanyService {
    List<Company> getAllCompanies();
    Company getCompanyById(Integer id);
    Company createCompany(Company company);
    void deleteCompany(Integer id);
}
 

 

4. Service 实现类 com.eazybytes.jobportal.service.impl.CompanyServiceImpl

就是截图里面这个类!核心重点
java
 
运行
 
 
package com.eazybytes.jobportal.service.impl;

import com.eazybytes.jobportal.entity.Company;
import com.eazybytes.jobportal.repository.CompanyRepository;
import com.eazybytes.jobportal.service.ICompanyService;
import org.springframework.stereotype.Service;
import java.util.List;

@Service
public class CompanyServiceImpl implements ICompanyService {

    // final + 构造器注入【企业标准写法】
    private final CompanyRepository companyRepository;

    // 构造注入,不需要@Autowired(SpringBoot 4.3+)
    public CompanyServiceImpl(CompanyRepository companyRepository) {
        this.companyRepository = companyRepository;
    }

    @Override
    public List<Company> getAllCompanies() {
        // 调用Repository操作数据库
        return companyRepository.findAll();
    }

    @Override
    public Company getCompanyById(Integer id) {
        return companyRepository.findById(id).orElse(null);
    }

    @Override
    public Company createCompany(Company company) {
        // 这里可以写业务校验逻辑
        return companyRepository.save(company);
    }

    @Override
    public void deleteCompany(Integer id) {
        companyRepository.deleteById(id);
    }
}
 

 

5. Controller com.eazybytes.jobportal.controller.CompanyController

只接收请求、响应,无业务、无数据库代码
java
 
运行
 
 
package com.eazybytes.jobportal.controller;

import com.eazybytes.jobportal.entity.Company;
import com.eazybytes.jobportal.service.ICompanyService;
import org.springframework.web.bind.annotation.*;
import java.util.List;

@RestController
@RequestMapping("/company")
public class CompanyController {

    private final ICompanyService companyService;

    // 构造注入Service接口
    public CompanyController(ICompanyService companyService) {
        this.companyService = companyService;
    }

    @GetMapping
    public List<Company> getAll() {
        return companyService.getAllCompanies();
    }

    @GetMapping("/{id}")
    public Company getById(@PathVariable Integer id) {
        return companyService.getCompanyById(id);
    }

    @PostMapping
    public Company add(@RequestBody Company company) {
        return companyService.createCompany(company);
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Integer id) {
        companyService.deleteCompany(id);
    }
}

 

 

三、调用流程完整演示

浏览器访问 GET http://localhost:8080/company
  1. 请求进入 CompanyController
  2. Controller 调用 companyService.getAllCompanies()
  3. 实际执行 CompanyServiceImpl.getAllCompanies()
  4. ServiceImpl 调用 companyRepository.findAll()
  5. Repository 和数据库交互查询数据
  6. 数据原路逐层返回给前端

 

 

 

 

  • Lombok 只作用于 Java 类,主要用在 Entity 实体、DTO;
  • Service、Controller 一般不用 @Data,多用 @Slf4j 打印日志。

 

 

 

posted @ 2026-07-30 15:34  漫漫长路</>  阅读(9)  评论(0)    收藏  举报