本文主要介紹
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";
}
produces屬性調整資料響應格式
這時候請求該頁面傳回的資料格式就是
text/html;charset=UTF-8
了。如果我們不添加
produces
配置,那麼由于我們也配置了
StringHttpMessageConverter
,并且配置的
StringHttpMessageConverter
執行順序早于
MappingJackson2HttpMessageConverter
等
JSON
消息轉換器,那麼這時候傳回的資料格式就是
text/plain;charset=UTF-8
。具體看各自應用的消息轉換器配置情況。
consumes屬性配置
既然有
produces
屬性可以配置資料的響應格式,那麼當然也有對應的
consumes
配置用來限定請求映射的資料格式。如下面這段代碼:
這裡我們定義了兩個同樣的請求映射
/htmlReq
,其中一個通過
consumes
限定了請求映射的資料格式必須是
text/html
,另一個不限定資料映射格式。
限定請求映射的資料格式為html
不限定請求映射的資料格式
可以看到請求的資料格式如果是
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
處理器有序清單。
通過@Order和@Priority以及Ordered控制排序
@EnableAutoConfiguration
@EnableAutoConfiguration
注解用于激活
Spring
的自動配置,在
SpringBoot
項目可能看得比較少,因為實際上該注解已經預設組合到
@SpringBootApplication
注解了。該注解的主要作用簡單了解就是搜尋所有
classpath
路徑下的
META-INF/spring.factories
配置檔案中的
org.springframework.boot.autoconfigure.EnableAutoConfiguration
配置項中定義的類完全限定名,然後将這些類統一作為配置類交給
Spring
進行自動配置。搜尋可以發現
classpath
下有很多的
spring.factories
配置檔案:
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
進行判斷是否生成自動代理切面。
限于篇幅原因,本文不少注解沒有執行個體講解,後續有機會我們會單獨開篇講解。如有勘誤,歡迎斧正!