一. Spring常用注解
@Controller、@Service 、@Repository是@Component的衍生注解,功能同@Component
@Controller 用于Controller層的類
@Service 用于Service層的類
@Repository 用于Dao層的類
這四個注解功能一樣,都是代表将某個類注冊到Spring中
@Autowired 它可以對類成員變量、方法及構造函數進行标注,讓 spring 完成 bean 自動裝配的工作。
@Autowired 預設是按照類去比對,配合 @Qualifier 指定按照名稱去裝配 bean。
作用:**設定屬性的對象** 或對方法進行傳參
public class ClassName {
@Autowired(required = false /*required:定義該屬性是否允許為null,預設true*/)
@Qualifier("userDao") //@Qualifier- value:需要注入的bean的id
private UserDao userDao;
@Resource(name = "userDao")
private UserDao userDao;
}
說明:
@Autowired 按類型裝配,一般生産中都使用它
@Qualifier 可以指定bean的id,一般用于有多個同一類型bean的場景。
類型:**屬性注解**、方法注解
作用:**設定屬性的值**或對方法進行傳參
範例:
@Value("李四")
private String name;
@Value("本奇")
public void setName(String name) {
this.name = name;
}
@Value("${jdbc.username")//配置檔案指派
private String username;
說明:
@value一般用于讀取properties檔案中的屬性值
**注解的方式注入非引用類型,不需要setter方法**
@Scope(作用域)
Scope,也稱作用域,在 Spring IoC 容器是指其建立的 Bean 對象相對于其他 Bean 對象的請求可見範圍。
在 Spring IoC 容器中具有以下幾種作用域:
基本作用域(singleton、prototype),Web 作用域(reqeust、session、globalsession),自定義作用域。
- 範例:
// 預設為singleton
@Scope("prototype")
public class ClassName{}
- 相關屬性
singleton:單例模式,在整個Spring IoC容器中,使用singleton定義的Bean将隻有一個執行個體。
prototype:原型模式,每次通過容器的getBean方法擷取prototype定義的Bean時,都将産生一個新的Bean執行個體。
request:對于每次HTTP請求,使用request定義的Bean都将産生一個新執行個體,即每次HTTP請求将會産生不同的Bean執行個體。
隻有在Web應用中使用Spring時,該作用域才有效。
session:對于每次HTTP Session,使用session定義的Bean豆漿産生一個新執行個體。
同樣隻有在Web應用中使用Spring時,該作用域才有效。
globalsession:每個全局的HTTP Session,使用session定義的Bean都将産生一個新執行個體。
典型情況下,僅在使用portlet context的時候有效。同樣隻有在Web應用中使用Spring時,該作用域才有效。
其中比較常用的是singleton和prototype兩種作用域。對于singleton作用域的Bean,每次請求該Bean都将獲得相同的執行個體。
容器負責跟蹤Bean執行個體的狀态,負責維護Bean執行個體的生命周期行為;
如果一個Bean被設定成prototype作用域,程式每次請求該id的Bean,Spring都會建立一個Bean執行個體,然後傳回給程式。
在這種情況下,Spring容器僅僅使用new 關鍵字建立Bean執行個體,一旦建立成功,容器不在跟蹤執行個體,也不會維護Bean執行個體的狀态。
如果不指定Bean的作用域,Spring預設使用singleton作用域。Java在建立Java執行個體時,需要進行記憶體申請;
銷毀執行個體時,需要完成垃圾回收,這些工作都會導緻系統開銷的增加。是以,prototype作用域Bean的建立、銷毀代價比較大。
而singleton作用域的Bean執行個體一旦建立成功,可以重複使用。是以,除非必要,否則盡量避免将Bean被設定成prototype作用域。
二. SpringMVC常用注解
@RestController
@RestController = @Controller+@ResponseBody
是以使用@RestController替換@Controller以後,就無須在方法上添加@ResponseBody
@RestController是一個組合注解,寫在類上面,是組合了@ResponseBody和@Controller,
預設了類中所有的方法都包含ResponseBody注解的一種簡寫形式
@PathVariable
作用:
用于綁定 url 中的占位符。例如:請求 url 中 /delete/{id},這個{id}就是 url 占位符。
url 支援占位符是 spring3.0 之後加入的。
public Map test(@PathVariable("id") Integer id){
}
@RequestMapping 是 Spring Web 應用程式中最常被用到的注解之一。
這個注解會将 HTTP 請求映射到 MVC 和 REST 控制器的處理方法上。
并且一個處理請求位址映射的注解,可用在類或方法上。
用于類上,表示類中的所有響應請求的方法都是以該位址作為父路徑。
@XxxMapping
@PostMapping() <=> @RequestMapping(method = RequestMethod.POST)用于将HTTP POST請求映射到特定處理程式方法的注釋。
@PutMapping() <=> @RequestMapping(method = RequestMethod.PUT)
@DeleteMapping() <=> @RequestMapping(method = RequestMethod.DELETE)
@GetMapping() <=> @RequestMapping(method = RequestMethod.GET)用于将HTTP GET請求映射到特定處理程式方法的注釋。
@RequestBody這個一般處理的是在ajax請求中聲明contentType: “application/json; charset=utf-8”時候。也就是json資料
@RequestParam這個一般就是在ajax裡面沒有聲明contentType的時候,為預設的urlencode格式時,用這個。
@ResponseBody:表示該方法的傳回結果直接寫入HTTP response body 中,一般在異步擷取資料時使用也就是AJAX
@RestController
@RequestMapping("/rest/user")
@ResponseBody
public class UserController {
@PostMapping("")
public Map add(@RequestBody User user){
}
@PutMapping("")
public Map update(@RequestBody User user){
}
@DeleteMapping("/{id}")
public Map delete(@PathVariable("id") Integer id){
}
注意,此時@PathVariable可以不寫value的值,這是因為它注解參數名與占位符相同,
如果不同就必須要寫value的值,即:@PathVariable(“id”)
@GetMapping("/{id}")
public Map find(@PathVariable Integer id){
}
}