Springboot or Spring 相关注解

@Autowired

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

  1. @Service
  2. public class UserService {
  3. ......
  4. }
  5. @RestController
  6. @RequestMapping("/users")
  7. public class UserController {
  8. @Autowired
  9. private UserService userService;
  10. ......
  11. }

@Component,@Repository,@Service,@Controller

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

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

@RestController

@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器 bean,并且是将函数的返回值直 接填入 HTTP 响应体中,是 REST 风格的控制器。
单独使用 @Controller 不加 @ResponseBody的话一般使用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。@Controller +@ResponseBody 返回 JSON 或 XML 形式数据
关于@RestController 和 @Controller的对比,请看这篇文章:@RestController vs @Controller

@Configuration

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

  1. @Configuration
  2. public class AppConfig {
  3. @Bean
  4. public TransferService transferService() {
  5. return new TransferServiceImpl();
  6. }
  7. }

处理常见的HTTP请求类型

5 种常见的请求类型:

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

GET 请求

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

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

POST 请求

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

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

PUT 请求

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

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

DELETE 请求

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

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

一个优秀的springboot入门教程:https://github.com/CodingDocs/springboot-guide

自动装配机制

我们现在提到自动装配的时候,一般会和 Spring Boot 联系在一起。但是,实际上 Spring Framework 早就实现了这个功能。Spring Boot 只是在其基础上,通过 SPI 的方式,做了进一步优化。
SpringBoot 定义了一套接口规范,这套规范规定:SpringBoot 在启动时会扫描外部引用 jar 包中的META-INF/spring.factories文件,将文件中配置的类型信息加载到 Spring 容器(此处涉及到 JVM 类加载机制与 Spring 的容器知识),并执行类中定义的各种操作。对于外部 jar 来说,只需要按照 SpringBoot 定义的标准,就能将自己的功能装置进 SpringBoot。
没有 Spring Boot 的情况下,如果我们需要引入第三方依赖,需要手动配置,非常麻烦。但是,Spring Boot 中,我们直接引入一个 starter 即可。比如你想要在项目中使用 redis 的话,直接在项目中引入对应的 starter 即可。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-data-redis</artifactId>
  4. </dependency>

引入 starter 之后,我们通过少量注解和一些简单的配置就能使用第三方组件提供的功能了。
在我看来,自动装配可以简单理解为:通过注解或者一些简单的配置就能在 Spring Boot 的帮助下实现某块功能。
而不会像没有 Spring Boot 的时候,我们写一个 RestFul Web 服务,还首先需要进行如下配置。

  1. @Configuration
  2. public class RESTConfiguration
  3. {
  4. @Bean
  5. public View jsonTemplate() {
  6. MappingJackson2JsonView view = new MappingJackson2JsonView();
  7. view.setPrettyPrint(true);
  8. return view;
  9. }
  10. @Bean
  11. public ViewResolver viewResolver() {
  12. return new BeanNameViewResolver();
  13. }
  14. }
  1. <beans xmlns="http://www.springframework.org/schema/beans"
  2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
  3. xmlns:mvc="http://www.springframework.org/schema/mvc"
  4. xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  5. http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
  6. http://www.springframework.org/schema/mvc/ http://www.springframework.org/schema/mvc/spring-mvc.xsd">
  7. <context:component-scan base-package="com.howtodoinjava.demo" />
  8. <mvc:annotation-driven />
  9. <!-- JSON Support -->
  10. <bean name="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"/>
  11. <bean name="jsonTemplate" class="org.springframework.web.servlet.view.json.MappingJackson2JsonView"/>
  12. </beans>

但是,Spring Boot 项目,我们只需要添加相关依赖,无需配置,通过启动下面的 main 方法即可。

  1. Spring Boot 项目,我们只需要添加相关依赖,无需配置,通过启动下面的 main 方法即可。

并且,我们通过 Spring Boot 的全局配置文件 application.properties或application.yml即可对项目进行设置比如更换端口号
image.png