本文由葡萄城技術團隊釋出。轉載請註明出處:葡萄城官網,葡萄城為開發者提供專業的開發工具、解決方案和服務,賦能開發者。
前言
本文小編將詳細解析Spring Boot框架,並通過程式碼舉例說明每個層的作用。我們將深入探討Spring Boot的整體架構,包括展示層、業務邏輯層和資料存取層。通過這些例子,讀者將更加清晰地瞭解每個層在應用程式中的具體作用。通過程式碼範例,我們將幫助讀者更好地理解和應用Spring Boot框架,從而提高應用程式的可維護性和可延伸性。
什麼是Spring Boot
在介紹Spring Boot框架的分層之前,小編先為大家介紹一下什麼是Spring Boot:
Spring Boot是一個基於Spring框架的開發框架,旨在簡化Spring應用程式的搭建和開發。Spring Boot提供了很多自動化設定的功能,可以快速地搭建一個基於Spring的Web應用程式,而不需要手動進行繁瑣的設定。
Spring Boot可以幫助開發人員快速構建各種型別的應用程式,包括Web應用程式、RESTful服務、批次處理應用程式和基於訊息的應用程式等。它採用Java程式語言,並且可以與各種其他技術整合,例如Thymeleaf、MongoDB、Redis等。
Spring Boot還提供了很多有用的工具和外掛,例如Spring Boot CLI(命令列介面),可以幫助開發人員更加便捷地建立、執行和測試Spring Boot應用程式。此外,Spring Boot還支援各種構建工具,例如Maven和Gradle,以及各種開發環境,例如Eclipse和IntelliJ IDEA。
Spring Boot分層:
Spring Boot主要分為4層:Controller層、Service層、Repository/DAO層和Model層。
1. Controller層
在SpringBoot中,Controller層是MVC(Model-View-Controller)模式中的控制器部分,負責處理來自使用者發起的HTTP請求,並返回相應的響應結果。Controller層接收到請求後,通常會呼叫Service層進行業務邏輯處理,最後再將處理結果封裝成響應物件並返回給前端。
一個Controller類通常包含多個方法,每個方法對應一個不同的HTTP請求路徑,並使用特定的註解來標識。例如,使用@GetMapping註解表示該方法處理GET請求,@PostMapping表示該方法處理POST請求。同時,通過@RequestParam註解可以獲取請求引數,@PathVariable註解可以獲取URL路徑引數,@RequestBody註解可以獲取請求體中的資料。
2. Service層
在Spring Boot中,Service層是應用程式的一部分,負責處理業務邏輯和協調不同的元件。它是控制器(Controller)和資料存取層(Repository)之間的中間層,用於將業務邏輯與資料操作解耦。
Service層的主要職責可以總結如下:
3. Repository/DAO層
DAO全稱是Data Access Object,其主要目標是從資料庫高效獲取(查詢)資料,併為service層提供服務。
Repository/DAO層的主要職責可以總結如下:
4. Model層
在Spring Boot中,Model層物件是用於封裝和傳遞資料的Java物件。它表示應用程式中的業務資料,並負責處理資料的獲取、儲存和修改等操作。Model層物件通常具有以下特點:
程式碼範例:
1.Controller層:
ProjectController.java
package com.example.Controller;
//import statements goes here
@RestController
public class UserController {
//List all the available projects
@GetMapping(path = "/projects", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<Project>> getProjects() {
// perform validation checks
// return the services provided by service layer
}
//Apply for the project
@PostMapping(path = "/apply-project", consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<HttpStatus> applyProject(@RequestBody Map<String,String> json) {
// perform validation checks
// return the services provided by service layer
}
//Upload resume
@PostMapping(path = "/upload-resume/{usn}")
public ResponseEntity<List<Object>> uploadToDB(@RequestParam("file") MultipartFile[] file,@PathVariable String usn) {
// perform validation checks
// return the services provided by service layer
}
//Download resume
@GetMapping("/files/download/{fileName:.+}")
public ResponseEntity downloadFromDB(@PathVariable String fileName) {
// perform validation checks
// return the services provided by service layer
}
}
上面例子使用了@GetMapping和@PostMapping:
@GetMapping註解用於將一個方法對映到指定的HTTP GET請求。它可以用於處理瀏覽器直接存取某個URL或者其他應用程式發起GET請求的情況。通過在方法上新增@GetMapping,我們可以定義一個處理該請求的方法,並在方法中編寫相應的業務邏輯。
@PostMapping註解用於將一個方法對映到指定的HTTP POST請求。它可以用於處理表單提交、使用者端資料上傳等操作。通過在方法上新增@PostMapping,我們可以定義一個處理該請求的方法,並在方法中編寫相應的業務邏輯。
2.Service層:
下面這段定義了專案相關的服務方法,並規定這些方法的輸入引數和返回值。
在程式碼範例中,ProjectService 介面宣告了三個方法:
ProjectService.java
package com.example.Service;
// import statements
public interface ProjectService {
ResponseEntity<List<Project>> getProjects();
HttpStatus applyProject(String USN,int project_id);
ResponseEntity<List<Object>> uploadProjectDocument(MultipartFile[] files,int project_id);
}
ProjectServiceImpl.java
package com.example.Service;
//import statements
@Service
public class ProjectServiceImpl implements ProjectService {
//dependency injection of DAO to be gone here (Autowire)
@Override
public ResponseEntity<List<Project>> getProjects() {
try {
//Business logic implementation using DAO services
} catch (Exception e) {
return new ResponseEntity<>(null,HttpStatus.INTERNAL_SERVER_ERROR) ;
}
}
@Override
public HttpStatus applyProject(String USN, int project_id) {
//Business logic implementation using DAO services
}
//helper functions
public ResponseEntity uploadToLocalFileSystem(MultipartFile file,int project_id) {
}
@Override
public ResponseEntity<List<Object>> uploadProjectDocument(MultipartFile[] files,int project_id) {
//Business logic implementation using DAO services
}
}
3.Repository/DAO層:
下面的這段程式碼是一個介面類,屬於包名為"com.example.Dao"的專案資料存取物件(DAO)。它擴充套件了 JpaRepository<Project, Integer> 介面,該介面提供了基本的CRUD(建立、讀取、更新、刪除)操作方法,用於對資料庫中的 "Project" 實體進行操作。
ProjectDAO.java
package com.example.Dao;
//import statements
public interface ProjectDao extends JpaRepository<Project,Integer> {
//You can also include native queries on top of CRUD operations provided by JPA
// Add queries here using @Query annotations and corresponding functions
@Query(value = "Your SQL query ",nativeQuery = true)
public List<Project> getProjects();
}
}
4.Model層:
下面這段程式碼定義了一個名為 "Project" 的實體類,表示一個專案。它包含了專案的各個屬性(如專案ID、公司名稱、描述、要求等),並與其他實體類(如員工、學生、檔案、資金等)之間建立了關聯關係。通過使用 JPA 註解,該類可以方便地進行資料庫操作和查詢。
程式碼中的各個部分的含義如下:
Project.java
package com.example.Entity;
//import statements
@Entity
@Table(name = "project")
public class Project {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int project_id;
@Column(nullable = false, name = "company_name")
private String company_name;
@Column(nullable = false, name = "description")
private String description;
@Column(nullable = false, name = "requirements")
private String requirements;
@Column(nullable = false, name = "manager")
private String manager;
@Column(nullable = false, name = "start_date")
private Date start_date = new Date();
@Column( name = "end_date")
private Date end_date = new Date();
@Column(nullable = false,name = "opening")
private int opening;
@Column(name = "resources")
private String resources;
public Set<Staff> getStaff_incharge() {
return staff_incharge;
}
public void setStaff_incharge(Set<Staff> staff_incharge) {
this.staff_incharge = staff_incharge;
}
public Set<Student> getApplied_students() {
return applied_students;
}
public Set<Document> getDocuments() {
return documents;
}
public void setDocuments(Set<Document> documents) {
this.documents = documents;
}
@JsonIgnore
@ManyToMany(mappedBy="funded_projects")
private Set<Fund> funds;
public Set<Fund> getFunds() {
return funds;
}
public void setFunds(Set<Fund> funds) {
this.funds = funds;
}
public void setApplied_students(Set<Student> applied_students) {
this.applied_students = applied_students;
}
public Set<Student> getWorking_students() {
return working_students;
}
public void setWorking_students(Set<Student> working_students) {
this.working_students = working_students;
}
//constructors
public Project() {
super();
}
public Project(int project_id, String company_name, String description, String requirements, String manager, Date start_date, Date end_date, int opening, String resources) {
super();
this.project_id = project_id;
this.company_name = company_name;
this.description = description;
this.requirements = requirements;
this.manager = manager;
this.start_date = start_date;
this.end_date = end_date;
this.opening = opening;
this.resources = resources;
}
public int getProject_id() {
return project_id;
}
public void setProject_id(int project_id) {
this.project_id = project_id;
}
public String getCompany_name() {
return company_name;
}
public void setCompany_name(String company_name) {
this.company_name = company_name;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getRequirements() {
return requirements;
}
public void setRequirements(String requirements) {
this.requirements = requirements;
}
public String getManager() {
return manager;
}
public void setManager(String manager) {
this.manager = manager;
}
public Date getStart_date() {
return start_date;
}
public void setStart_date(Date start_date) {
this.start_date = start_date;
}
public Date getEnd_date() {
return end_date;
}
public void setEnd_date(Date end_date) {
this.end_date = end_date;
}
public int getOpening() {
return opening;
}
public void setOpening(int opening) {
this.opening = opening;
}
public String getResources() {
return resources;
}
public void setResources(String resources) {
this.resources = resources;
}
@Override
public String toString() {
return "Project{" +
"project_id=" + project_id +
", company_name='" + company_name + '\'' +
", description='" + description + '\'' +
", requirements='" + requirements + '\'' +
", manager='" + manager + '\'' +
", start_date=" + start_date +
", end_date=" + end_date +
", opening=" + opening +
", resources='" + resources + '\'' +
'}';
}
}
總結
本文為讀者詳細介紹了Spring Boot框架的四層構架,以及如何使用各種技術和工具來進行開發。通過閱讀本文,希望可以幫助讀者可以更好地理解Spring Boot框架的工作原理和應用場景,並能夠利用所學知識來實現自己的專案。
參考資料:《Understanding Spring Boot Architecture》
擴充套件連結: