1. 程式人生 > 實用技巧 >SpringBoot常見註解

SpringBoot常見註解

0.前言

這篇文章介紹的 Spring/SpringBoot 常用註解基本已經涵蓋你工作中遇到的大部分常用的場景。對於每一個註解我都說了具體用法,掌握搞懂,使用 SpringBoot 來開發專案基本沒啥大問題了!

1. @SpringBootApplication

這裡先單獨拎出@SpringBootApplication 註解說一下,雖然我們一般不會主動去使用它。

這個註解是 Spring Boot 專案的基石,建立 SpringBoot 專案之後會預設在主類加上。_

@SpringBootApplication
public class SpringSecurityJwtGuideApplication {
      public static void main(java.lang.String[] args) {
        SpringApplication.run(SpringSecurityJwtGuideApplication.class, args);
    }
}

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

package org.springframework.boot.autoconfigure;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
		@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
   ......
}

package org.springframework.boot;
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Configuration
public @interface SpringBootConfiguration {

}

根據 SpringBoot 官網,這三個註解的作用分別是:

  • @EnableAutoConfiguration:啟用 SpringBoot 的自動配置機制
  • @ComponentScan: 掃描被@Component (@Service,@Controller)註解的 bean,註解預設會掃描該類所在的包下所有的類。
  • @Configuration:允許在 Spring 上下文中註冊額外的 bean 或匯入其他配置類

2. Spring Bean 相關

2.1. @Autowired @Resource

自動匯入物件到類中,被注入進的類同樣要被 Spring 容器管理比如:Service 類注入到 Controller 類中。

@Service
public class UserService {
  ......
}

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

2.2. Component,@Repository,@Service, @Controller

我們一般使用 @Autowired 註解讓 Spring 容器幫我們自動裝配 bean。要想把類標識成可用於 @Autowired 註解自動裝配的 bean 的類,可以採用以下註解實現:

  • @Component :通用的註解,可標註任意類為 Spring 元件。如果一個 Bean 不知道屬於哪個層,可以使用@Component 註解標註。
  • @Repository : 對應持久層即 Dao 層,主要用於資料庫相關操作。
  • @Service : 對應服務層,主要涉及一些複雜的邏輯,需要用到 Dao 層。
  • @Controller : 對應 Spring MVC 控制層,主要使用者接受使用者請求並呼叫 Service 層返回資料給前端頁面。

2.3. @RestController

@RestController註解是@Controller和@ResponseBody的合集,表示這是個控制器 bean,並且是將函式的返回值直 接填入 HTTP 響應體中,是 REST 風格的控制器。

現在都是前後端分離,說實話我已經很久沒有用過@Controller。如果你的專案太老了的話,就當我沒說。

單獨使用 @Controller 不加 @ResponseBody的話一般使用在要返回一個檢視的情況,這種情況屬於比較傳統的 Spring MVC 的應用,對應於前後端不分離的情況。@Controller +@ResponseBody 返回 JSON 或 XML 形式資料

2.4. @Scope

宣告 Spring Bean 的作用域,使用方法:

@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 內有效。

2.5. Configuration

一般用來宣告配置類,可以使用 @Component註解替代,不過使用Configuration註解宣告配置類更加語義化。

@Configuration
public class AppConfig {
    @Bean
    public TransferService transferService() {
        return new TransferServiceImpl();
    }

}

3. 處理常見的 HTTP 請求型別

5 種常見的請求型別:

  • GET :請求從伺服器獲取特定資源。舉個例子:GET /users(獲取所有學生)
  • POST :在伺服器上建立一個新的資源。舉個例子:POST /users(建立學生)
  • PUT :更新伺服器上的資源(客戶端提供更新後的整個資源)。舉個例子:PUT /users/12(更新編號為 12 的學生)
  • DELETE :從伺服器刪除特定的資源。舉個例子:DELETE /users/12(刪除編號為 12 的學生)
  • PATCH :更新伺服器上的資源(客戶端提供更改的屬性,可以看做作是部分更新),使用的比較少,這裡就不舉例子了。

3.1. GET 請求

@GetMapping("users") 等價於@RequestMapping(value="/users",method=RequestMethod.GET)

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

3.2. POST 請求

@PostMapping("users") 等價於@RequestMapping(value="/users",method=RequestMethod.POST)

關於@RequestBody註解的使用,在下面的“前後端傳值”這塊會講到。

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

3.3. PUT 請求

@PutMapping("/users/{userId}") 等價於@RequestMapping(value="/users/{userId}",method=RequestMethod.PUT)

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

3.4. DELETE 請求

@DeleteMapping("/users/{userId}")等價於@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)

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

3.5. PATCH 請求

一般實際專案中,我們都是 PUT 不夠用了之後才用 PATCH 請求去更新資料。

  @PatchMapping("/profile")
  public ResponseEntity updateStudent(@RequestBody StudentUpdateRequest studentUpdateRequest) {
        studentRepository.updateDetail(studentUpdateRequest);
        return ResponseEntity.ok().build();
    }

4. 前後端傳值

掌握前後端傳值的正確姿勢,是你開始 CRUD 的第一步!

4.1. @PathVariable@RequestParam

@PathVariable用於獲取路徑引數,@RequestParam用於獲取查詢引數。

舉個簡單的例子:

@GetMapping("/klasses/{klassId}/teachers")
public List<Teacher> getKlassRelatedTeachers(
         @PathVariable("klassId") Long klassId,
         @RequestParam(value = "type", required = false) String type ) {
...
}

如果我們請求的 url 是:/klasses/{123456}/teachers?type=web

那麼我們服務獲取到的資料就是:klassId=123456,type=web

4.2. @RequestBody

用於讀取 Request 請求(可能是 POST,PUT,DELETE,GET 請求)的 body 部分並且Content-Type 為 application/json 格式的資料,接收到資料之後會自動將資料繫結到 Java 物件上去。系統會使用HttpMessageConverter或者自定義的HttpMessageConverter將請求的 body 中的 json 字串轉換為 java 物件。

我用一個簡單的例子來給演示一下基本使用!

我們有一個註冊的介面:

@PostMapping("/sign-up")
public ResponseEntity signUp(@RequestBody @Valid UserRegisterRequest userRegisterRequest) {
  userService.save(userRegisterRequest);
  return ResponseEntity.ok().build();
}

UserRegisterRequest物件:

@Data
@AllArgsConstructor
@NoArgsConstructor
public class UserRegisterRequest {
    @NotBlank
    private String userName;
    @NotBlank
    private String password;
    @FullName
    @NotBlank
    private String fullName;
}

我們傳送 post 請求到這個介面,並且 body 攜帶 JSON 資料:

{"userName":"coder","fullName":"shuangkou","password":"123456"}

這樣我們的後端就可以直接把 json 格式的資料對映到我們的 UserRegisterRequest 類上。