一、Spring Web MVC 與 Spring Bean 注解
Spring Web MVC 注解
@RequestMapping@RequestMapping注解的主要用途是將Web請(qǐng)求與請(qǐng)求處理類中的方法進(jìn)行映射。Spring MVC和Spring WebFlux都通過RquestMappingHandlerMapping和RequestMappingHndlerAdapter兩個(gè)類來提供對(duì)@RequestMapping注解的支持。@RequestMapping注解對(duì)請(qǐng)求處理類中的請(qǐng)求處理方法進(jìn)行標(biāo)注;@RequestMapping注解擁有以下的六個(gè)配置屬性:-
value:映射的請(qǐng)求URL或者其別名 -
method:兼容HTTP的方法名 -
params:根據(jù)HTTP參數(shù)的存在、缺省或值對(duì)請(qǐng)求進(jìn)行過濾 -
header:根據(jù)HTTP Header的存在、缺省或值對(duì)請(qǐng)求進(jìn)行過濾 -
consume:設(shè)定在HTTP請(qǐng)求正文中允許使用的媒體類型 -
product:在HTTP響應(yīng)體中允許使用的媒體類型


HttpMessageConverter傳遞的,根據(jù)請(qǐng)求主體中的參數(shù)名與對(duì)象的屬性名進(jìn)行匹配并綁定值。此外,還可以通過@Valid注解對(duì)請(qǐng)求主體中的參數(shù)進(jìn)行校驗(yàn)。下面是一個(gè)使用@RequestBody的示例:

@GetMapping
@GetMapping注解用于處理HTTP GET請(qǐng)求,并將請(qǐng)求映射到具體的處理方法中。具體來說,@GetMapping是一個(gè)組合注解,它相當(dāng)于是@RequestMapping(method=RequestMethod.GET)的快捷方式。下面是@GetMapping的一個(gè)使用示例:

@PostMapping注解用于處理HTTP POST請(qǐng)求,并將請(qǐng)求映射到具體的處理方法中。@PostMapping與@GetMapping一樣,也是一個(gè)組合注解,它相當(dāng)于是@RequestMapping(method=HttpMethod.POST)的快捷方式。下面是使用@PostMapping的一個(gè)示例:

@PutMapping注解用于處理HTTP PUT請(qǐng)求,并將請(qǐng)求映射到具體的處理方法中,@PutMapping是一個(gè)組合注解,相當(dāng)于是@RequestMapping(method=HttpMethod.PUT)的快捷方式。下面是使用@PutMapping的一個(gè)示例:

@DeleteMapping注解用于處理HTTP DELETE請(qǐng)求,并將請(qǐng)求映射到刪除方法中。@DeleteMapping是一個(gè)組合注解,它相當(dāng)于是@RequestMapping(method=HttpMethod.DELETE)的快捷方式。下面是使用@DeleteMapping的一個(gè)示例:

@PatchMapping注解用于處理HTTP PATCH請(qǐng)求,并將請(qǐng)求映射到對(duì)應(yīng)的處理方法中。@PatchMapping相當(dāng)于是@RequestMapping(method=HttpMethod.PATCH)的快捷方式。下面是一個(gè)簡(jiǎn)單的示例:

@ControllerAdvice是@Component注解的一個(gè)延伸注解,Spring會(huì)自動(dòng)掃描并檢測(cè)被@ControllerAdvice所標(biāo)注的類。@ControllerAdvice需要和@ExceptionHandler、@InitBinder以及@ModelAttribute注解搭配使用,主要是用來處理控制器所拋出的異常信息。首先,我們需要定義一個(gè)被@ControllerAdvice所標(biāo)注的類,在該類中,定義一個(gè)用于處理具體異常的方法,并使用@ExceptionHandler注解進(jìn)行標(biāo)記。此外,在有必要的時(shí)候,可以使用@InitBinder在類中進(jìn)行全局的配置,還可以使用@ModelAttribute配置與視圖相關(guān)的參數(shù)。使用@ControllerAdvice注解,就可以快速的創(chuàng)建統(tǒng)一的,自定義的異常處理類。下面是一個(gè)使用@ControllerAdvice的示例代碼:

@ResponseBody會(huì)自動(dòng)將控制器中方法的返回值寫入到HTTP響應(yīng)中。特別的,@ResponseBody注解只能用在被@Controller注解標(biāo)記的類中。如果在被@RestController標(biāo)記的類中,則方法不需要使用@ResponseBody注解進(jìn)行標(biāo)注。@RestController相當(dāng)于是@Controller和@ResponseBody的組合注解。下面是使用該注解的一個(gè)示例

@ExceptionHander注解用于標(biāo)注處理特定類型異常類所拋出異常的方法。當(dāng)控制器中的方法拋出異常時(shí),Spring會(huì)自動(dòng)捕獲異常,并將捕獲的異常信息傳遞給被@ExceptionHandler標(biāo)注的方法。下面是使用該注解的一個(gè)示例:

@ResponseStatus注解可以標(biāo)注請(qǐng)求處理方法。使用此注解,可以指定響應(yīng)所需要的HTTP STATUS。特別地,我們可以使用HttpStauts類對(duì)該注解的value屬性進(jìn)行賦值。下面是使用@ResponseStatus注解的一個(gè)示例:

@PathVariable注解是將方法中的參數(shù)綁定到請(qǐng)求URI中的模板變量上。可以通過@RequestMapping注解來指定URI的模板變量,然后使用@PathVariable注解將方法中的參數(shù)綁定到模板變量上。特別地,@PathVariable注解允許我們使用value或name屬性來給參數(shù)取一個(gè)別名。下面是使用此注解的一個(gè)示例:

{ }進(jìn)行包裹,如果方法的參數(shù)名與URI模板變量名一致,則在@PathVariable中就可以省略別名的定義。下面是一個(gè)簡(jiǎn)寫的示例:

@PathVariable中設(shè)置require = false@RequestParam@RequestParam注解用于將方法的參數(shù)與Web請(qǐng)求的傳遞的參數(shù)進(jìn)行綁定。使用@RequestParam可以輕松的訪問HTTP請(qǐng)求參數(shù)的值。下面是使用該注解的代碼示例:

@PathVariable的配置相同,特別的,如果傳遞的參數(shù)為空,還可以通過defaultValue設(shè)置一個(gè)默認(rèn)值。示例代碼如下:

@Controller是@Component注解的一個(gè)延伸,Spring 會(huì)自動(dòng)掃描并配置被該注解標(biāo)注的類。此注解用于標(biāo)注Spring MVC的控制器。下面是使用此注解的示例代碼:

@RestController是在Spring 4.0開始引入的,這是一個(gè)特定的控制器注解。此注解相當(dāng)于@Controller和@ResponseBody的快捷方式。當(dāng)使用此注解時(shí),不需要再在方法上使用@ResponseBody注解。下面是使用此注解的示例代碼:

@ModelAttribute通過此注解,可以通過模型索引名稱來訪問已經(jīng)存在于控制器中的model。下面是使用此注解的一個(gè)簡(jiǎn)單示例:

@PathVariable和@RequestParam注解一樣,如果參數(shù)名與模型具有相同的名字,則不必指定索引名稱,簡(jiǎn)寫示例如下:

@ModelAttribute對(duì)方法進(jìn)行標(biāo)注,Spring會(huì)將方法的返回值綁定到具體的Model上。示例如下:

@ModelAttribute注解標(biāo)注的所有方法都將被執(zhí)行。@CrossOrigin@CrossOrigin注解將為請(qǐng)求處理類或請(qǐng)求處理方法提供跨域調(diào)用支持。如果我們將此注解標(biāo)注類,那么類中的所有方法都將獲得支持跨域的能力。使用此注解的好處是可以微調(diào)跨域行為。使用此注解的示例如下:

@InitBinder注解用于標(biāo)注初始化WebDataBinider的方法,該方法用于對(duì)Http請(qǐng)求傳遞的表單數(shù)據(jù)進(jìn)行處理,如時(shí)間格式化、字符串處理等。下面是使用此注解的示例:

二、Spring Bean 注解在本小節(jié)中,主要列舉與Spring Bean相關(guān)的4個(gè)注解以及它們的使用方式。@ComponentScan
@ComponentScan注解用于配置Spring需要掃描的被組件注解注釋的類所在的包??梢酝ㄟ^配置其basePackages屬性或者value屬性來配置需要掃描的包路徑。value屬性是basePackages的別名。此注解的用法如下:@Component@Component注解用于標(biāo)注一個(gè)普通的組件類,它沒有明確的業(yè)務(wù)范圍,只是通知Spring被此注解的類需要被納入到Spring Bean容器中并進(jìn)行管理。此注解的使用示例如下:

@Service注解是@Component的一個(gè)延伸(特例),它用于標(biāo)注業(yè)務(wù)邏輯類。與@Component注解一樣,被此注解標(biāo)注的類,會(huì)自動(dòng)被Spring所管理。下面是使用@Service注解的示例:

@Repository
@Repository注解也是@Component注解的延伸,與@Component注解一樣,被此注解標(biāo)注的類會(huì)被Spring自動(dòng)管理起來,@Repository注解用于標(biāo)注DAO層的數(shù)據(jù)持久化類。此注解的用法如下:

三、Spring Dependency Inject 與 Bean Scops注解
Spring DI注解
@DependsOn@DependsOn注解可以配置Spring IoC容器在初始化一個(gè)Bean之前,先初始化其他的Bean對(duì)象。下面是此注解使用示例代碼:

initMethod和destroyMethod的用法。示例如下:

Scops注解
@Scope@Scope注解可以用來定義@Component標(biāo)注的類的作用范圍以及@Bean所標(biāo)記的類的作用范圍。@Scope所限定的作用范圍有:singleton、prototype、request、session、globalSession或者其他的自定義范圍。這里以prototype為例子進(jìn)行講解。當(dāng)一個(gè)Spring Bean被聲明為prototype(原型模式)時(shí),在每次需要使用到該類的時(shí)候,Spring IoC容器都會(huì)初始化一個(gè)新的改類的實(shí)例。在定義一個(gè)Bean時(shí),可以設(shè)置Bean的scope屬性為prototype:scope=“prototype”,也可以使用@Scope注解設(shè)置,如下:@Scope(value=ConfigurableBeanFactory.SCOPE_PROPTOTYPE) 下面將給出兩種不同的方式來使用@Scope注解,示例代碼如下:


四、容器配置注解
@Autowired
@Autowired注解用于標(biāo)記Spring將要解析和注入的依賴項(xiàng)。此注解可以作用在構(gòu)造函數(shù)、字段和setter方法上。作用于構(gòu)造函數(shù)下面是@Autowired注解標(biāo)注構(gòu)造函數(shù)的使用示例:

作用于setter方法下面是@Autowired注解標(biāo)注setter方法的示例代碼:

作用于字段@Autowired注解標(biāo)注字段是最簡(jiǎn)單的,只需要在對(duì)應(yīng)的字段上加入此注解即可,示例代碼如下:

@Primary
當(dāng)系統(tǒng)中需要配置多個(gè)具有相同類型的bean時(shí),@Primary可以定義這些Bean的優(yōu)先級(jí)。下面將給出一個(gè)實(shí)例代碼來說明這一特性:

輸出結(jié)果:
thisissendDingDingmethodmessage.
@PostConstruct與@PreDestroy
值得注意的是,這兩個(gè)注解不屬于Spring,它們是源于JSR-250中的兩個(gè)注解,位于common-annotations.jar中。@PostConstruct注解用于標(biāo)注在Bean被Spring初始化之前需要執(zhí)行的方法。@PreDestroy注解用于標(biāo)注Bean被銷毀前需要執(zhí)行的方法。下面是具體的示例代碼:

@Qualifier
當(dāng)系統(tǒng)中存在同一類型的多個(gè)Bean時(shí),@Autowired在進(jìn)行依賴注入的時(shí)候就不知道該選擇哪一個(gè)實(shí)現(xiàn)類進(jìn)行注入。此時(shí),我們可以使用@Qualifier注解來微調(diào),幫助@Autowired選擇正確的依賴項(xiàng)。下面是一個(gè)關(guān)于此注解的代碼示例:

五、Spring Boot注解
@SpringBootApplication@SpringBootApplication注解是一個(gè)快捷的配置注解,在被它標(biāo)注的類中,可以定義一個(gè)或多個(gè)Bean,并自動(dòng)觸發(fā)自動(dòng)配置Bean和自動(dòng)掃描組件。此注解相當(dāng)于@Configuration、@EnableAutoConfiguration和@ComponentScan的組合。在Spring Boot應(yīng)用程序的主類中,就使用了此注解。示例代碼如下:@SpringBootApplication publicclassApplication{ publicstaticvoidmain(String[]args){ SpringApplication.run(Application.class,args); } } @EnableAutoConfiguration@EnableAutoConfiguration注解用于通知Spring,根據(jù)當(dāng)前類路徑下引入的依賴包,自動(dòng)配置與這些依賴包相關(guān)的配置項(xiàng)。@ConditionalOnClass與@ConditionalOnMissingClass這兩個(gè)注解屬于類條件注解,它們根據(jù)是否存在某個(gè)類作為判斷依據(jù)來決定是否要執(zhí)行某些配置。下面是一個(gè)簡(jiǎn)單的示例代碼:
@Configuration @ConditionalOnClass(DataSource.class) classMySQLAutoConfiguration{ //... } @ConditionalOnBean與@ConditionalOnMissingBean這兩個(gè)注解屬于對(duì)象條件注解,根據(jù)是否存在某個(gè)對(duì)象作為依據(jù)來決定是否要執(zhí)行某些配置方法。示例代碼如下:
@Bean @ConditionalOnBean(name="dataSource") LocalContainerEntityManagerFactoryBeanentityManagerFactory(){ //... } @Bean @ConditionalOnMissingBean publicMyBeanmyBean(){ //... } @ConditionalOnProperty@ConditionalOnProperty注解會(huì)根據(jù)Spring配置文件中的配置項(xiàng)是否滿足配置要求,從而決定是否要執(zhí)行被其標(biāo)注的方法。示例代碼如下:
@Bean @ConditionalOnProperty(name="alipay",havingValue="on") Alipayalipay(){ returnnewAlipay(); } @ConditionalOnResource此注解用于檢測(cè)當(dāng)某個(gè)配置文件存在使,則觸發(fā)被其標(biāo)注的方法,下面是使用此注解的代碼示例:
@ConditionalOnResource(resources="classpath:website.properties") PropertiesaddWebsiteProperties(){ //... } @ConditionalOnWebApplication與@ConditionalOnNotWebApplication這兩個(gè)注解用于判斷當(dāng)前的應(yīng)用程序是否是Web應(yīng)用程序。如果當(dāng)前應(yīng)用是Web應(yīng)用程序,則使用Spring WebApplicationContext,并定義其會(huì)話的生命周期。下面是一個(gè)簡(jiǎn)單的示例:
@ConditionalOnWebApplication HealthCheckControllerhealthCheckController(){ //... } @ConditionalExpression此注解可以讓我們控制更細(xì)粒度的基于表達(dá)式的配置條件限制。當(dāng)表達(dá)式滿足某個(gè)條件或者表達(dá)式為真的時(shí)候,將會(huì)執(zhí)行被此注解標(biāo)注的方法。
@Bean @ConditionalException("${localstore}&&${local=='true'}") LocalFileStorestore(){ //... } @Conditional@Conditional注解可以控制更為復(fù)雜的配置條件。在Spring內(nèi)置的條件控制注解不滿足應(yīng)用需求的時(shí)候,可以使用此注解定義自定義的控制條件,以達(dá)到自定義的要求。下面是使用該注解的簡(jiǎn)單示例:
@Conditioanl(CustomConditioanl.class) CustomPropertiesaddCustomProperties(){ //... }
總結(jié)
本次課程總結(jié)了Spring Boot中常見的各類型注解的使用方式,讓大家能夠統(tǒng)一的對(duì)Spring Boot常用注解有一個(gè)全面的了解。由于篇幅的原因,關(guān)于Spring Boot不常用的一些注解,將在下一次分享中進(jìn)行補(bǔ)充和說明。審核編輯:湯梓紅
-
spring
+關(guān)注
關(guān)注
0文章
341瀏覽量
15692 -
MVC
+關(guān)注
關(guān)注
0文章
73瀏覽量
14325 -
Boot
+關(guān)注
關(guān)注
0文章
154瀏覽量
37404 -
注解
+關(guān)注
關(guān)注
0文章
18瀏覽量
2822
原文標(biāo)題:40 個(gè) SpringBoot 常用注解:讓生產(chǎn)力爆表!
文章出處:【微信號(hào):AndroidPush,微信公眾號(hào):Android編程精選】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
Spring Boot如何實(shí)現(xiàn)異步任務(wù)
啟動(dòng)Spring Boot項(xiàng)目應(yīng)用的三種方法
Spring Boot嵌入式Web容器原理是什么
Spring Boot特有的實(shí)踐
簡(jiǎn)述Spring Boot數(shù)據(jù)校驗(yàn)
Spring Web MVC注解
Spring Dependency Inject與Bean Scops注解
容器配置及Spring Boot注解
Spring Boot Actuator快速入門
Spring Boot啟動(dòng) Eureka流程
Spring Boot的啟動(dòng)原理
Spring Boot 的設(shè)計(jì)目標(biāo)

Spring Boot常用注解與使用方式
評(píng)論