做網(wǎng)站費(fèi)用 優(yōu)幫云網(wǎng)站友情鏈接
在創(chuàng)建一個(gè) Spring Boot 項(xiàng)目時(shí),為了提高代碼的可維護(hù)性、可擴(kuò)展性和清晰度,通常會(huì)按照一定的分層架構(gòu)進(jìn)行設(shè)計(jì)。常見的分層架構(gòu)包括以下幾層:
1. Controller 層(Web 層)
- 作用:接收用戶請(qǐng)求,并調(diào)用相應(yīng)的業(yè)務(wù)邏輯,最終返回視圖或數(shù)據(jù)。
- 職責(zé):處理 HTTP 請(qǐng)求,調(diào)用 Service 層來(lái)執(zhí)行業(yè)務(wù)邏輯,然后將結(jié)果返回給客戶端。通常,Controller 層與前端直接交互。
- 組件:Spring MVC 中的
@RestController
或@Controller
注解。 - 示例:
@RestController @RequestMapping("/api/users") public class UserController {@Autowiredprivate UserService userService;@GetMapping("/{id}")public User getUserById(@PathVariable Integer id) {return userService.getUserById(id);}@PostMappingpublic User createUser(@RequestBody User user) {return userService.createUser(user);} }
?2. Service 層(業(yè)務(wù)邏輯層)
- 作用:處理業(yè)務(wù)邏輯,通常是 Controller 層和 Repository 層之間的紐帶。
- 職責(zé):包含具體的業(yè)務(wù)處理代碼,如數(shù)據(jù)驗(yàn)證、數(shù)據(jù)加工、調(diào)度等。Service 層不直接處理 HTTP 請(qǐng)求,而是處理具體的業(yè)務(wù)邏輯,通常依賴于 DAO 層來(lái)訪問數(shù)據(jù)庫(kù)。
- 組件:
@Service
注解。 - 示例:
@Service public class UserService {@Autowiredprivate UserRepository userRepository;public User getUserById(Integer id) {return userRepository.findById(id).orElse(null);}public User createUser(User user) {return userRepository.save(user);} }
3. Repository 層(持久層)?
- 作用:負(fù)責(zé)與數(shù)據(jù)庫(kù)進(jìn)行交互,執(zhí)行 CRUD 操作。
- 職責(zé):直接與數(shù)據(jù)庫(kù)進(jìn)行交互,通過 JPA、MyBatis、JDBC 等方式執(zhí)行數(shù)據(jù)操作。常見的 Spring 數(shù)據(jù)庫(kù)訪問技術(shù)是 JPA 和 Spring Data JPA。
- 組件:
@Repository
注解,或者繼承JpaRepository
、CrudRepository
等接口。 - 示例:
@Repository public interface UserRepository extends JpaRepository<User, Integer> {// JpaRepository 提供了基本的 CRUD 操作 }
4. Entity 層(實(shí)體層)?
- 作用:表示數(shù)據(jù)庫(kù)中的一張表,映射到 Java 類中。實(shí)體類通常包含表中的字段及對(duì)應(yīng)的 getter 和 setter 方法。
- 職責(zé):定義數(shù)據(jù)庫(kù)表的結(jié)構(gòu)。它通常包含屬性、構(gòu)造函數(shù)、getter 和 setter 方法,可能還會(huì)有一些業(yè)務(wù)邏輯(如驗(yàn)證)或其他注解(如驗(yàn)證注解)。
- 組件:JPA 實(shí)體類使用
@Entity
、@Table
、@Id
等注解。 - 示例:
@Entity @Table(name = "user") public class User {@Id@GeneratedValue(strategy = GenerationType.IDENTITY)private Integer id;private String userName;private String userPassword;private String userRegisterTime;// getters and setters }
5. DTO 層(數(shù)據(jù)傳輸對(duì)象層)
- 作用:傳遞數(shù)據(jù)的對(duì)象,通常用于 Controller 層和前端之間的數(shù)據(jù)交換,或者后端系統(tǒng)之間的交互。
- 職責(zé):封裝前端需要的數(shù)據(jù),簡(jiǎn)化數(shù)據(jù)傳輸。DTO 通常不包含業(yè)務(wù)邏輯,而是用于數(shù)據(jù)傳輸。DTO 和實(shí)體類類似,但通常會(huì)避免直接暴露實(shí)體類的敏感信息。
- 示例:
public class UserDTO {private Integer id;private String userName;private String userRegisterTime;// getters and setters }
6. Exception 層(異常處理層)?
- 作用:集中管理異常,捕獲并處理應(yīng)用程序中的各種異常。
- 職責(zé):處理應(yīng)用程序中的業(yè)務(wù)異常和系統(tǒng)異常。通常使用
@ControllerAdvice
或@ExceptionHandler
來(lái)全局處理異常,并返回友好的錯(cuò)誤信息給用戶。 - 組件:
@ControllerAdvice
注解。 - 示例:
@ControllerAdvice public class GlobalExceptionHandler {@ExceptionHandler(UserNotFoundException.class)public ResponseEntity<String> handleUserNotFoundException(UserNotFoundException ex) {return new ResponseEntity<>(ex.getMessage(), HttpStatus.NOT_FOUND);} }
7. Configuration 層(配置層)?
- 作用:用于存放 Spring 配置類,負(fù)責(zé)整個(gè)應(yīng)用程序的配置。
- 職責(zé):處理項(xiàng)目的所有配置內(nèi)容,包括數(shù)據(jù)庫(kù)配置、第三方 API 配置、消息隊(duì)列配置等。Spring Boot 可以通過
@Configuration
或@EnableAutoConfiguration
自動(dòng)配置項(xiàng)目。 - 組件:
@Configuration
注解。 - 示例:
@Configuration public class AppConfig {@Beanpublic DataSource dataSource() {// 配置數(shù)據(jù)源}@Beanpublic JdbcTemplate jdbcTemplate(DataSource dataSource) {return new JdbcTemplate(dataSource);} }
8. Utility 層(工具類層)?
- 作用:提供一些通用的工具類,用于簡(jiǎn)化業(yè)務(wù)代碼的實(shí)現(xiàn),通常包括日期、字符串、文件等常見操作。
- 職責(zé):提供一些靜態(tài)方法,避免在各層中重復(fù)編寫相似的代碼。
- 示例:
public class DateUtil {public static String formatDate(LocalDate date) {// 格式化日期} }
常見的分層架構(gòu)結(jié)構(gòu):?
com.example.project
│
├── controller # 控制器層(Web 層)
│ └── UserController.java
│
├── service # 業(yè)務(wù)邏輯層
│ └── UserService.java
│
├── repository # 持久層
│ └── UserRepository.java
│
├── entity # 實(shí)體層
│ └── User.java
│
├── dto # 數(shù)據(jù)傳輸對(duì)象
│ └── UserDTO.java
│
├── exception # 異常處理層
│ └── GlobalExceptionHandler.java
│
├── config # 配置層
│ └── AppConfig.java
│
├── util # 工具類
│ └── DateUtil.java
│
└── Application.java # 啟動(dòng)類