Restful風格下的SpringBoot的注解開發(fā)
電商網(wǎng)站經(jīng)常用到的restful風格,只是一種開發(fā)想法,不是開發(fā)框架,現(xiàn)在的技術并沒有完全實現(xiàn)restful風格。
restful風格是一種架構理念,完美的詮釋了http協(xié)議
restful方式需要配置一套restful風格的前端控制器,用/來標識url-pattern
RequestMapping(value="/ViewItems/{id}" String id) java類里面使用@PathVariable(“id”) 注解進行參數(shù)綁定String id或者綁定java Bean的bean屬性
@SpringBootApplication
Springboot提供了統(tǒng)一的注解@SpringBootApplication來替代這三個注解@Configuration、@EnableAutoConfiguration、@ComponentScan,簡化程序配置
@EnableAutoConfiguration
@EnableAutoConfiguration;能夠自動配置spring的上下文,試圖猜測和配置你想要的bean類,通常會自動根據(jù)你的類路徑和你bean定義自動配置
@ComponentScan
@ComponentScan;會自動掃描指定包下的全部標有@Component的類,并注冊成bean,當然包括@Component下的子注解@Service、@Repository、@Controller。
@Configuration
Configuration標注在類上,相當于把該類作為spring的xml配置文件中的<beans>,作用為:配置spring容器(應用上下文),加載配置xml文件的注解。用@Configuration注解該類,等價于XML中配置beans;用@Bean標注方法等價于XML中配置bean。
@EnableWebMvc
想要以Java形式默認的配置,你可以簡單的實現(xiàn)WebMvcConfigurer接口,或者繼承WebMvcConfigurerAdapter并重寫需要的方法:
@Configuration
class WebMvcConfig ectends WebMvcConfigurerAdapter{
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry){
registry.addResourceHandler("swagger-ui.html").addReesourceLocations("classpath:/META-INF/resources/");
resistry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
}
}
@Override
Override是一個marker annotation類型,它被用標注方法。它說明了被標注的方法重載了父類的方法,起到了斷言的作用。如果寫錯,編譯器可以檢測出哪些是錯誤的,這樣能保證你的重寫方法正確。
@Validated(value={})
這個注解指的是分組校驗,與BindingResult配對出現(xiàn),ModelandView的Model對象可以將error的信息返回給界面。
@ModelAttributr("")
注解回顯到request里面的key
處理回顯信息:
不管你輸入什么,正確都提交,錯誤都回顯,同時還可以將返回值返回給界面,最簡單的回顯跟數(shù)據(jù)類型的回顯,直接使用model.addAttribute("allErrors",allErrors);
配置圖片的虛擬目錄跟訪問路徑,tomcat雙擊->model->選擇第二個add ecternal web model
@Autowired
Apring 2.5引入了@Autowired注釋,它可以對類成員變量,方法及構造函數(shù)進行標注,完成自動裝配的工作。通過@Autowired的使用來消除set,get方法。
@RequesMapping("fileUpload")
注解為控制器指定可以處理哪些特定的URL請求。
@ApiOperation和@ApiParam
@ApiOperation(value = "接口說明"),httpMethod = "接口請求方式",response = “接口返回參數(shù)類型”,notes = “接口發(fā)布說明”;其他參數(shù)可參考源碼,不是spring自帶的注解,而是swagger里
com.wordnik.swagger.annotations.ApiOperation;
@ApiParam(required = "是否必須參數(shù)",name = "參數(shù)名稱",value = "參數(shù)具體描述")。
@Api
修飾整個類,描述Controller的作用。
@ApiOperation
描述一個類的一個方法,或者說一個接口。
@ApiModel
用Model對象來接收參數(shù)。
@ApiParam
@ApiParam(value = "token",required = true) @RequestParam String token
Web前端/移動端HTTP請求方式:直接把參數(shù)附帶到URL后面,或者AJAX方法,表單提交。
@ApiProperty
用對象接收參數(shù)時,描述對象的一個字段。
@ApiResponse
HTTP響應其中1個請求以及參數(shù)描述。
@ApiResponses
HTTP響應整體描述。
@ApiModelProperty
對象屬性@ApiModelProperty 用在出入?yún)?shù)對象的字段上。
@RestController
@RestController注解是它繼承自@Controller注解。4.0之前的版本,spring MVC的組件都使用@Controller來標識當前類是一個控制器service。
使用這個特性,我們可以開發(fā)REST服務的時候不需要使用@Controller而專門的@RestController。
注解本身使用@Controller和@ResponseBody。使用了這個注解的類會被看作一個controller使用
@RequestMapping //的方法自己還有一個默認的@ResponseBody注解
@Api // 用于controller類上,用于協(xié)議集描述@ApiOperation用在controller的方法上,用于協(xié)議集描述
@ApiResponses //用在controller的方法上屬于Response集
@ApiResponse //用在@ApiResponses里邊,屬于Response集
@ApiImplicitParams //用在controller的方法上,屬于非對象參數(shù)集
@ApiImplicitParam //用在@ApiImplicitParams的方法里邊,屬于非對象參數(shù)集
@ApiModel //用在返回對象類上,描述返回對象的意義
@component
把普通pojo實例化到spring容器中,相當于配置文件中<bean id = "" class = "">
@RequesBody
該注解用于讀取Request請求的body部分數(shù)據(jù),使用系統(tǒng)默認配置的HttpMessageConverter進行解析,然后把相應的數(shù)據(jù)綁定到要返回的對象上,再把HttpMessageConverter返回的對象數(shù)據(jù)綁定到controller中方法的參數(shù)上
@Data
注解在類上,為類提供讀寫屬性,此外還提供了equals()、hashCode()、toString()方法
@Builder
注解在類上,為類提供一個內部的Builder
@Synchronized
注解在方法上,為方法提供同步鎖
@Log4j
注解在類上,為類提供一個屬性名為log的log4j的日志對象
@Slf4j
注解在類上,為類提供一個屬性名為log的slf4j的日志對象
@Service
用于標注業(yè)務層組件
@Controller
用于標注控制層組件(如struts中的action)
@Repository
用于標注數(shù)據(jù)訪問組件,即DAO組件
@Component
泛指組件,當組件不好歸檔的時候,我們可以使用這個注解進行標注。
@Autowired
@Qualifier(“chinese”)
當接口存在兩個實體類的時候必須使用@Qualifier指定注入那個實體類,否則可以省略,只寫@Autowired。<mvc:annocation-driven/>注解形式的可以不用配置json轉換器,直接使用@ResponseBodey注解,可以設置json跟Bean直接按的轉換:該注解用于將Controller的方法返回的對象,通過適當?shù)腍ttpMessageConverter轉換為指定格式后,寫入到Response對象body數(shù)據(jù)區(qū)。
@ModelAttribute
在方法定義上使用@ModelAttribute
注解:Spring MVC在調用目標處理方法前,會逐個調用在方法級上標注了
@ModelAttribute的方法,在方法的入?yún)⑶罢{用
@ModelAttribute注解:可以從隱含對象中獲取隱含的模型數(shù)據(jù)中獲取對象,再將請求參數(shù)綁定到對象中,再傳入入?yún)⒎椒ㄈ雲(yún)ο筇砑拥侥P椭小?/p>
@RequesParam
在處理方法入?yún)⑻幨褂聾RequestParam可以把請求參數(shù)傳遞給請求方法
@PathVariable
綁定URL占位符到入?yún)?/p>
@ExceptionHandler
注解到方法上,出現(xiàn)異常時會執(zhí)行該方法
@ControllerAdvice
使一個Contoller成為全局的異常處理類,類中用@ExceptionHandler方法注解的方法可以處理所有Controller發(fā)生的異常
@ResponseBody
該注解用于將Controller的方法返回的對象,通過適當?shù)腍ttpMessageConverter轉換為指定格式后,寫入到Response對象的body數(shù)據(jù)區(qū)。使用時機:返回的數(shù)據(jù)不是html標簽的頁面,而是其他某種格式的數(shù)據(jù)時(如json、xml)時使用當我們在Controller上標注了@RestController的方法返回的對象通過適當?shù)霓D換器轉換為指定的格式之后,寫入到response對象的body區(qū),通常用來返回JSON數(shù)據(jù)或者時xml數(shù)據(jù)。需要注意的是,在使用此注解之后不會再走試圖處理器,而是直接將數(shù)據(jù)寫入到輸入流中,他的效果等同于通過response對象輸出指定格式的數(shù)據(jù)。
@RequestMapping("/login")
@ResponseBody
public User login(User user){
return user;
}
/**
User字段:userName password
那么在前臺接受的數(shù)據(jù)為:'{"userName":"xxx","password";"xxx"}'
*/
//效果等價于如下代碼:
@RequestMapping(“/login”)
public void login(User user , HttpServiceResponse response){
response.getWriter.write(JSONObject.fromObject(user).toString());
}
//細節(jié)
/**
Google的一個json的jar包,隨時將對象封裝json返回。
Gson gson = new Gson();
String json = gson.toJson(對象);
*/
@Param
1.使用@Param注解
當以下面的方式進行寫SQL語句時:
@Select("select column from table where userid = #{userid} ")
public int selectColumn(int userid);
當你使用了@Param注解來聲明參數(shù)時,如果#{}或${}的方式都可以。
@Select("select column from table where userid = ${userid} ")
public int selectColumn(@Param("userid") int userid);
當你不使用@Param注解來聲明參數(shù)時,必須使用使用 #{}方式。如果使用 ${} 的方式,會報錯。
@Select("select column from table where userid = ${userid} ")
public int selectColumn(@Param("userid") int userid);
2,不使用@Param注解
不使用@Param注解時,參數(shù)只能有一個,并且是Javabean。在SQL語句里可以引用JavaBean的屬性,而且只能引用JavaBean的屬性
// 這里id是user的屬性
@Select("SELECT * from Table where id = ${id}")
Enchashment selectUserById(User user);