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
類上。