本文由葡萄城技术团队发布。转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具、解决方案和服务,赋能开发者。
前言
本文小编将详细解析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》
扩展链接:
从表单驱动到模型驱动,解读低代码开发平台的发展趋势
低代码开发平台是什么?