天天看點

postmapping注解_Spring注解介紹

    本文主要介紹

Spring

中一些常見注解的部分屬性配置介紹以及一些不常用注解的簡單介紹。下面讓我們直接進入主題吧。

@RequestMapping

@RequestMapping

可以說是

SpringMVC

以及

OpenFeign

中最常用的注解,其主要用于映射

Web

請求。

produces屬性配置

    目前主流服務大部分都是使用

JSON

作為資料交換格式,即通過配置

MappingJackson2HttpMessageConverter

或者

GsonHttpMessageConverter

定義資料交換時使用

JSON

進行格式轉換。這時候預設的響應資料格式就是

application/json

,如果想要讓

RequestMapping

請求傳回

text/html

或者其他非

application/json

資料。那麼

RequestMapping#produces

就可以派上用場了。

produces

屬性配置可以調整資料響應格式,比如下面這段代碼:

Hello World!

\n" +                 " \n" +                 "\n";     }

postmapping注解_Spring注解介紹

produces屬性調整資料響應格式

    這時候請求該頁面傳回的資料格式就是

text/html;charset=UTF-8

了。如果我們不添加

produces

配置,那麼由于我們也配置了

StringHttpMessageConverter

,并且配置的

StringHttpMessageConverter

執行順序早于

MappingJackson2HttpMessageConverter

JSON

消息轉換器,那麼這時候傳回的資料格式就是

text/plain;charset=UTF-8

。具體看各自應用的消息轉換器配置情況。

consumes屬性配置

    既然有

produces

屬性可以配置資料的響應格式,那麼當然也有對應的

consumes

配置用來限定請求映射的資料格式。如下面這段代碼:

    這裡我們定義了兩個同樣的請求映射

/htmlReq

,其中一個通過

consumes

限定了請求映射的資料格式必須是

text/html

,另一個不限定資料映射格式。

postmapping注解_Spring注解介紹

限定請求映射的資料格式為html

postmapping注解_Spring注解介紹

不限定請求映射的資料格式

    可以看到請求的資料格式如果是

text/html

,那麼将會被映射到

htmlReq

方法。其他格式則被映射到

htmlReqNoConsumes

方法。

produces

consumes

屬性通常用于與外部的對接,使用頻率較低,有時候外部對接文檔不完善,這時候我們就要通過直接發送請求确認他們的請求響應資料格式要求,然後相應的使用

produces

consumes

進行調整。

派生注解

    說到

@RequestMapping

,就不得不提及它的派生注解:

@GetMapping

@PostMapping

@DeleteMapping

等注解。這些注解首先都标注了

@RequestMapping

,即他們本身都是

@RequestMapping

注解,然後通過

@AliasFor

注解将注解的屬性别名映射到

@RequestMapping

的屬性上。最後使用的使用通過

AnnotationUtils

AnnotatedElementUtils

進行别名配置合并或者同義化處理,注意派生注解在

Spring

架構注解中用的相當多,我們可以通過派生注解的方法進一步增強

@RequestMapping

,比如添加版本号映射功能等。這些後續有機會再講。

@Ordered 和 @Priority

@Ordered

注解和

@Priority

注解以及

org.springframework.core.Ordered

接口都可以定義

Bean

的執行個體化順序,同時

Spring

提供了

org.springframework.core.annotation.AnnotationAwareOrderComparator

工具類讓我們可以對特定的

Bean

數組或者清單依照從小到大進行排序。如下代碼:

    那麼啟動容器後,通過

AnnotationAwareOrderComparator#sort

方法排序所有

XxHandler

執行個體的時候,将能夠得到

ACBD

處理器有序清單。

postmapping注解_Spring注解介紹

通過@Order和@Priority以及Ordered控制排序

@EnableAutoConfiguration

@EnableAutoConfiguration

注解用于激活

Spring

的自動配置,在

SpringBoot

項目可能看得比較少,因為實際上該注解已經預設組合到

@SpringBootApplication

注解了。該注解的主要作用簡單了解就是搜尋所有

classpath

路徑下的

META-INF/spring.factories

配置檔案中的

org.springframework.boot.autoconfigure.EnableAutoConfiguration

配置項中定義的類完全限定名,然後将這些類統一作為配置類交給

Spring

進行自動配置。搜尋可以發現

classpath

下有很多的

spring.factories

配置檔案:

postmapping注解_Spring注解介紹

SpringFactories屬性配置檔案

spring.factories

配置檔案的

org.springframework.boot.autoconfigure.EnableAutoConfiguration

配置項是自定義

SpringBootStarter

的核心,通過該配置項和

@EnableAutoConfiguration

我們可以實作高度可插拔的

SpringBootStarter

,這個有機會可以另外開篇講解。

@Import

@Import

注解是一個比較有趣的注解,它既可以自由選擇需要加載的配置類,也可以高度自由地定義

Bean

的注冊。

    它隻有一個必填屬性

value

,具體有三種用法:

導入配置類

    這種方法導入的類通常标注有

@Configuration

,當然這不是硬性要求。比如

Druid

的資料源自動配置:

選擇性加載配置類

    這種方式導入的類必須實作

org.springframework.context.annotation.ImportSelector

接口,通過該接口的

selectImports(AnnotationMetadata importingClassMetadata)

方法确定導入的配置類。比如:

@CacheAutoConfiguration

動态注冊Bean

    這種方式導入的類必須實作

org.springframework.context.annotation.ImportBeanDefinitionRegistrar

接口,通過

registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry)

方法動态注冊

SpringBean

。比如:

MyBatis

@MapperScan

注解導入的

MapperScannerRegistrar

。是自

@Import

通常會結合

@EnableXxx

(

Spring

的自動配置類)注解使用。算是自動化配置的一個核心類。

@Role

    這個注解應該說大部分人沒見過,即使見過應該也不會用到。這個注解主要使用者标注

SpringBean

的角色。總共有三種角色:

ROLE_APPLICATION

    簡單了解就是這個

Bean

屬于使用者,是應用大部分

Bean

的角色。通常我們的

Bean

預設就是這種。

ROLE_SUPPORT

    訓示

Bean

同樣屬于使用者,但是一般是外部配置的比較複雜的

Bean

ROLE_INFRASTRUCTURE

    訓示

Bean

不屬于使用者,屬于

Spring

内部的基礎設施

Bean

,通常給

Spring

内部工作使用。

    這個注解在高度自定義校驗器(抽離成獨立依賴并提供給其他服務內建使用,而不是在各個應用中單獨配置)的時候會用到,如果你自己注冊到

Spring

LocalValidatorFactoryBean

沒有添加

@Role(BeanDefinition.ROLE_INFRASTRUCTURE)

注解,那麼運作時将直接報錯。預設的

ValidationAutoConfiguration

自動配置如下:

    目前該角色的

Bean

主要由

org.springframework.aop.framework.autoproxy.InfrastructureAdvisorAutoProxyCreator

進行判斷是否生成自動代理切面。

    限于篇幅原因,本文不少注解沒有執行個體講解,後續有機會我們會單獨開篇講解。如有勘誤,歡迎斧正!

繼續閱讀