spring boot 标准企业分层规范(SpringBoot + Spring Data JPA)
标准分层流向(必须遵守)
Controller(控制层) → Service接口 → ServiceImpl实现类 → Repository(DAO) → Entity实体规范铁律:
- Controller 禁止直接调用 Repository
- 业务逻辑全部写在
ServiceImpl- Repository 只做数据库操作,不写业务
- 优先使用构造器注入(不推荐字段 @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- 请求进入
CompanyController - Controller 调用
companyService.getAllCompanies() - 实际执行
CompanyServiceImpl.getAllCompanies() - ServiceImpl 调用
companyRepository.findAll() - Repository 和数据库交互查询数据
- 数据原路逐层返回给前端
- Lombok 只作用于 Java 类,主要用在 Entity 实体、DTO;
- Service、Controller 一般不用 @Data,多用 @Slf4j 打印日志。

浙公网安备 33010602011771号