前言:

SpringMVC的层:Dao、Service、Controller、View的关系

  • Dao层: 负责数据持久化,与数据库进行联络的任务都封装在其中,Dao层的数据源以及相关的数据库连接参数都在Spring配置文件中进行配置。Dao接口中的方法都大同小异,因为对数据库的基本操作类似:insert、delete、update、select。在Dao层定义的一些方法,在Service层并没有被使用的情况。Dao层的操作经过抽象后基本都是通用的,在Dao层完成相关的定义,有利于后期的Service层的扩展
  • Service层: 建立在Dao层之上,Controller层之下。调用Dao的接口(Mapper.java),为Controller层提供接口。负责业务模块的逻辑应用设计,首先设计接口,在设计其实现的类。
  • Controller层: 负责具体业务模块流程的控制,即调用Service层的接口来控制业务流程。负责url映射(action)
  • View层:表示层,负责前端jsp页面表示。

面向接口编程,表示层调用控制层,控制层调用业务层,业务层调用数据访问层。Dao层设计与设计的数据库表和实现类(对应的Entity或者JavaBean)一一对应,Entity类和java对象,与数据库表一一对应,是其对应的实现类。即一个Entity就是对应表中的一条记录。View层与Controller层结合紧密,需要二者结合协同开发。Service层、Dao层和其他层次耦合很低,完全可以单独开发。

SpringMVC的层:DAO、Service、Controller、View的关系1

@SpringBootApplication

我们可以把 @SpringBootApplication看作是 @Configuration@EnableAutoConfiguration@ComponentScan 注解的集合。

image-20210717100810165

在SpringBoot官网,这三个注解作用分别是:

  • @EnableAutoConfiguration : 启用SpringBoot的自动配置
  • @CompoentScan: 扫描被@Component (@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。
  • @Configuration:允许在 Spring 上下文中注册额外的 bean 或导入其他配置类

Spring Bean 相关

@Autowired

自动导入对象到类中,被注入进的类同样要被 Spring 容器管理比如:Service 类注入到 Controller 类中。

1
2
3
4
5
6
7
8
9
10
11
12
@Service
public class UserService{
......
}

@RestController
@RequestMapping("/users")
public class UserController{
@Autowired
private UserService userService;
......
}

Component, @Repository, @Service, @Controller

我们一般使用@Autowired 注解让Spring容器帮我自动装配bean,要想把类别标识成可用于@Autowired注解自动装配的bean的类,可以采用以下注解实现:

  • @Component: 通常的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪个层,可以使用@Compoent注解标注。
  • @Repository: 对应持久层即Dao层,主要用于数据库相关操作。
  • @Service: 对应服务层,主要涉及一些复杂的逻辑,需要用到Dao层。
  • @Controller: 对应Spring MVC控制层, 主要用户接受用户请求并调用Service层返回数据给前端页面。

@RestController

@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。

单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller +@ResponseBody 返回 JSON 或 XML 形式数据

@RestController VS @Controller

  • Controller 返回一个页面

单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。

图片

  • RestController 返回JSON 或 XML 形式数据

    @RestController只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。

图片

  • Controller +@ResponseBody 返回JSON 或 XML 形式数据

    如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用@Controller 并结合@ResponseBody注解,也就是说@Controller +@ResponseBody= @RestController(Spring 4 之后新加的注解)。

图片

@Scope

声明Spring Bean的作用域,使用方法:

1
2
3
4
5
@Bean
@Scope("singleton")
public Person personSingleton(){
return new Person();
}

四种常见的Spring Bean 的作用域:

  • singleton: 唯一bean实例,Spring中的bean默认地都是单例的;
  • prototype: 每次请求都会创建一个新的bean实例
  • request: 每一次HTTP请求都会产生一个新的Bean,该bean仅在当前HTTP request 内有效。
  • session: 每一次HTTP请求都会产生一个新的Bean,该bean仅在当前HTTP session 内有效。

Configuration

一般用来声明配置类,可以使用 @Component注解替代,不过使用Configuration注解声明配置类更加语义化。

1
2
3
4
5
6
7
@Configutation
public class AppCofig{
@Bean
public TransferService transferSevice(){
return new TransferServiceImpl();
}
}

处理常见的 HTTP 请求类型

5 种常见的请求类型:

  • GET :请求从服务器获取特定资源。举个例子:GET /users(获取所有学生)
  • POST :在服务器上创建一个新的资源。举个例子:POST /users(创建学生)
  • PUT :更新服务器上的资源(客户端提供更新后的整个资源)。举个例子:PUT /users/12(更新编号为 12 的学生)
  • DELETE :从服务器删除特定的资源。举个例子:DELETE /users/12(删除编号为 12 的学生)
  • PATCH :更新服务器上的资源(客户端提供更改的属性,可以看做作是部分更新),使用的比较少,这里就不举例子了。

GET请求

@GetMapping(“user”) 等价于 @RequestMapping(value = “/users”, method = RequestMethod.GET)

1
2
3
4
@GetMapping("/user")
public ResponseEntity<List<User>> getAllUser(){
return userRepository.findAll();
}

POST请求

@PostMapping(“users”) 等价于@RequestMapping(value=”/users”,method=RequestMethod.POST)

1
2
3
4
@PostMapping("/users")
public ResponseEnity<user> createUser(@Vaild @RequestBody UserCreateRequest userCreateRequest){
return userRespository.save(user);
}

PUT请求

@PutMapping(“/users/{userId}”) 等价于 @RequestMapping(value=”/users/{userId}”,method=RequestMethod.PUT)

1
2
3
4
5
@PutMapping("/users/{userId}")
public ResponseEntity<User> updateUser(@PathVariable(value = "userId") Long userId,
@Vaild @RequestBody UserUpdateRequest userUpdateRequest){
........
}

DELETE请求

@DeleteMapping(“/users/{userId}”)等价于 @RequestMapping(value=”/users/{userId}”,method=RequestMethod.DELETE)

1
2
3
4
@DeleteMapping("/users/{userId}")
public ResponseEnity deleteUser(@PathVariable(value = "userId") Long userId){
.......
}

PATCH请求

一般实际项目中,我们都是PUT不够用之后才用PATCH请求去更新数据。

1
2
3
4
5
@PatchMapping("/profile")
public ResponseEnity updateStudent(@RequestBody StudentUpdateRequest studentUpdateRequest){
studentRepository.updateDetail(studentUpdateRequest);
return ResponseEntity.ok().build();
}