天天看點

Spring SpringMVC常用注解一. Spring常用注解二. SpringMVC常用注解

一. 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){
	    }
    }