Spring常用注解
本文列舉一些常用的SpringBoot開發注解,希望能幫助讀者在SpringBoot開發中正確地使用注解,
@Spring Application
主程式注解,spring框架的main函式自帶注解,一般不需要開發人員操作,Spring Initializer會寫好,
@Controller
標注控制器類,控制器中的方法可以回傳一個視圖,在Web開發中一般使用的少(主要是用@RestController),
@ResponseBody
@Controller+@ResponseBody=@RestController
因為SpringBoot已經封裝了@RestController,所以一般不需要使用上面等式左邊的方式(好比茴字的四種寫法),我個人認為不需要花時間學習,
@RequestBody
@PostMapping中會再次介紹,將json決議為java物件,
使用場景:json傳參
@RequestMapping
@RequestMapping(“url“),用來將請求映射到方法,
在實際開發中,在具體的控制器類之前添加該注解即可,
@RequestParam
用來獲取url中?后的引數,
public void searchById(@RequestParam(value ="id", required = true, defaultValue = "0")int id){
// required, defaultValue不寫也可以
...
}
使用場景:URL傳參
@PathVariable
同樣是從URL中獲得引數,方式和@RequestParam不一樣,
@RequestMapping("/user/{id}")
public void searchById(@PathVariable(required = true)int id){
...
}
使用場景:URL傳參
@RestController
作用=@Controller+@ResponseBody,回傳json格式資料,現在Web開發中的Controller一般都是RestController,
一般和@RequestMapping、@GetMapping、@PostMapping配合使用,
使用方法:
@RequestController
public class RestController {
...
}
@GetMapping
回應GET請求,
@RequestController
@RequestMapping("rest")
public class RestController {
@GetMapping("get") // http://localhost:8080/rest/get
public String get(){
return "";
}
}
@GetMapping可以使用@PathVariable、@RequestParam
@PostMapping
回應POST請求,
@RequestController
@RequestMapping("rest")
public class RestController {
@PostMapping("post") // http://localhost:8080/rest/post
public String post(@RequestBody User user){
return "";
}
}
一般來說,POST方法的傳參不受限制,可以使用URL傳參,也可以使用@RequestBody獲取請求體中的json,并決議為回應的java物件,
POST方法和GET方法可以共用一個URL,不用擔心起沖突,即下面的使用方式是OK的:
@RequestController
@RequestMapping("rest")
public class RestController {
@GetMapping
public String get(){
return "";
}
@PostMapping
public String post(@RequestBody User user){
return user.toString();
}
}
// 不會沖突,只要請求方法正確(正確使用GET、POST),就能被正確的方法回應,
@PutMapping、@DeleteMapping使用方式大同小異,其實從功能上來說,@PostMapping能替代所有的請求,但是這么使用會導致代碼語意混亂,
簡單說明一下各種請求方法的使用場景:
| 方法 | 場景 |
|---|---|
| GET | 獲取資源 |
| POST | 新增資源 |
| PUT | 更新資源 |
| DELETE | 洗掉資源 |
@CrossOrigin
用來解決跨域問題,何為跨域移步這里
在Blog中,博主給了跨域的詳細例子:
| 當前頁面url | 被請求頁面url | 是否跨域 | 原因 |
|---|---|---|---|
| http://www.test.com/ | http://www.test.com/index.html | 否 | 同源(協議、域名、埠號相同) |
| http://www.test.com/ | https://www.test.com/index.html | 跨域 | 協議不同(http/https) |
| http://www.test.com/ | http://www.baidu.com/ | 跨域 | 主域名不同(test/baidu) |
| http://www.test.com/ | http://blog.test.com/ | 跨域 | 子域名不同(www/blog) |
| http://www.test.com:8080/ | http://www.test.com:7001/ | 跨域 | 埠號不同(8080/7001) |
(上表來自鏈接博文)
關于AJAX跨域問題移步這里
@RequestController
@RequestMapping("rest")
public class RestController {
@PostMapping
@CrossOrigin
public String post(@RequestBody User user){
return user.toString();
}
}
//跨域問題解決
@Service
Controller中一般是不寫邏輯的,都是直接呼叫相應的服務,我們需要吧業務邏輯封裝在服務中,
上面的例子只是為了方便才把邏輯寫入控制器,實際開發中不要圖這種方便,
@Service用來注冊bean,要放在服務的實作類之前,
接下來使用UserService做例子,這是一個介面,
// 介面類
public class UserService {
public ResponseVO addUser(User user);
}
// 實作類
?
@Service // 一定是在實作類而非介面類中
public class UserServiceImpl implements UserService {
public ResponseVO addUser(User user){
// implement the interface
}
}
// 控制器類
public class UserController {
@Autowired
private UserService userService;
}
一般在控制器類中,又一個Service成員,在這個例子中便是private UserService userService
我們當然可以選擇:
private UserService userService = new UserServiceImpl();
但是SpringBoot提供了更方便的做法:
@Autowired
private UserService userService;
只要實作類被正確的標注,那么@Autowired就能幫我們完成初始化任務,
關于Autowired的進一步介紹移步@Autowired
@Component
@Component和@Service非常類似,同樣用來注冊bean,使用方式也是一樣的,區別在二者的使用場景,
@Service用于注解業務邏輯層中的服務代碼,@Component用于注解通用性強的工具類(會被多方呼叫),
例如:
-
既被控制器呼叫,又被服務實作類呼叫的類
-
被多個控制器/服務實作類呼叫的類
@Autowired
@Autowired用來獲取bean,
在SpringBoot中,默認的匹配方式是byType,具體規則如下:
-
按照型別去容器找到對應的組件
如果找到:賦值
如果沒找到:報例外
如果找到多個:使用變數名作ID匹配,匹配上就賦值,沒有就報錯,
這里說明一下:ID即為類名的首字母小寫,例如UserServiceImpl類的ID就是userServiceImpl
-
可以使用@Qualifier注解指定ID
例子:
-
使用變數名作ID匹配
@Autowired
private UserService userService;
查找到多個相同的類:UserService(id = userService)及其子類UserServiceExtend(id = userServiceExtend)
這時,使用userService作id匹配到UserService類,
-
使用@Qualifier指定id
@Autowired
@Qualfier("adminServiceImpl")
private UserService userService; // private UserService userService = new AdminServiceImpl();
...
?
...
public class AdminServiceImpl implements UserService{
...
}
-
required=false
@Autowired是默認required=true的,設為false找不到就不會報錯,而是置為null,
@Resource
沒有@Autowired的按類匹配機制,但是可以指定name
@Resource(adminServiceImpl)
private UserService adminService;
...
?
public class AdminServiceImpl implements UserService{
...
}
功能基本被@Autowired覆寫,
@Resource(name = id) = @Qualifier(id) + @Autowired
除了利用上面這個等式縮減代碼,我想不到別的使用場景,
@Configuration + @Beans
這倆是一起使用的,可以人為注冊Bean,替代@Service和@Component
@Configuration
public class Beans{
@Bean
public UserService userServiceImpl(){
return new UserServiceImpl();
}
@Bean
public UserService adminServiceImpl(){
return new AdminServiceImpl();
}
}
?
// UserController.java
@Resource(name=adminServiceImpl)
private UserService adminService;
?
@Resource(name=userServiceImpl)
private UserService userService;
說實話比較雞肋的功能......反正了解就好,
@Value
還差一口氣就看完了,
@Value用來從組態檔(.properties/.yaml/.yml)中取引數,
例如:
# application.properties
?
local.name = crx
@Value("${local.name}")
private String author;
一般只有一些賬戶密碼資料需要使用該功能,
常用注解到這里就介紹完了,最后說一句,實操才是硬道理,要多練!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257015.html
標籤:Java
上一篇:設計模式(十三)——代理模式
