重學(xué)C++重構(gòu)你的C++知識(shí)體系2022升級(jí)
5 Spring5源代碼16-@EnableWebMvc注釋原理
1.需求和運(yùn)用
一旦我們將九個(gè)自定義組件放入容器,DispatcherServlet就會(huì)初始化,以查看容器中能否有我們本人的組件,因而我們不需求本人的默許組件。我們的許多默許功用都喪失了。
我們的希冀:
您本人的組件能夠生效。
SpringMVC的默許還是管用的。
能夠運(yùn)用@ enablewemvc+webmvconfiguration。@EnableWebMVC會(huì)導(dǎo)入9個(gè)組件到容器中,並且都有條目【我們能夠用WebMvcConfigurer自定義】,而不是默許運(yùn)用配置文件。
2.@EnableWebMvc
@保存(RetentionPolicy。運(yùn)轉(zhuǎn)時(shí)間)
@Target(ElementType。類型)
@已記載
@ Import(delegatingwebmvc configuration . class)
public @interface EnableWebMvc {
}
復(fù)製代碼
我們發(fā)現(xiàn),實(shí)踐上是經(jīng)過@Import注釋在容器中注冊(cè)了一個(gè)組件delegatingwebmvconfiguration,所以如今的中心是delegatingwebmvconfiguration類做了什麼?
3.拜托web MVC配置
兩個(gè)感知接口自動(dòng)將ApplicationContext對(duì)象和ServletContext對(duì)象注入該組件。如今我們要帶著兩個(gè)問題來看看這類源代碼?
爲(wèi)什麼這個(gè)組件能夠讓自定義配置類生效?
爲(wèi)此組件定義了哪些默許配置?
3.1拜托webmvconfiguration源代碼
DelegatingWebMvcConfiguration類十分簡(jiǎn)單,只要一個(gè)字段配置器,它保管一切的配置類對(duì)象。另外要留意一個(gè)辦法,set configurator(list configurator)辦法,用@Autowired(required = false)注釋,會(huì)自動(dòng)執(zhí)行。
@ Configuration(proxybean methods = false)
公共類拜托WebMvcConfiguration擴(kuò)展WebMvcConfigurationSupport {
//組合形式,組合一切配置類。
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
/**
*此處添加了注釋@Autowired(必填= false)。
*然前方法將在屬性填充階段執(zhí)行,其中辦法參數(shù)來自容器。
*會(huì)自動(dòng)沈著器中找到匹配類型的bean,然後反映執(zhí)行辦法。
*/
@自動(dòng)連線(必需=假)
公共void匯合配置器(列表配置器){
假如(!CollectionUtils.isEmpty(配置器)){
//將容器中的一切WebMvcConfigurer對(duì)象放入WebMvcConfigurerComposite
this . configurers . addwebmvc configurers(配置器);
}
}
/********************************************************************************/
/**
*以下辦法相似。
*向WebMvcConfigurerComposite的每個(gè)配置類添加配置的詳細(xì)過程參見3.1.1。
*/
@掩蓋
受維護(hù)的void配置途徑匹配(途徑匹配配置器配置器){
this . configurers . configurepathmatch(configurer);
}
...
/********************************************************************************/
//此辦法將獲取配置類定義的獨(dú)一考證程序。
@掩蓋
@Nullable
受維護(hù)的考證程序getValidator() {
返回this . configurers . get validator();
}
//此辦法將獲取配置類定義的獨(dú)一MessageCodesResolver。
@掩蓋
@Nullable
受維護(hù)的MessageCodesResolver getMessageCodesResolver(){
返回this . configurers . getmessagecodesresolver();
}
}
復(fù)製代碼
能夠看到,在DelegatingWebMvcConfiguration組件的屬性填充階段,會(huì)自動(dòng)找到容器中一切類型爲(wèi)WebMvcConfigurer的bean對(duì)象,然後以它們爲(wèi)參數(shù)調(diào)用set configurators(list configurators)辦法,一切配置類對(duì)象都會(huì)放入WebMvcConfigurerComposite中。
此外,它還重寫了父類的一些辦法(模板辦法形式)來向配置類注冊(cè)配置,並獲取配置類中的一些配置對(duì)象,如Validator或MessageCodesResolver。
3.2 WebMvcConfigurerComposite
下面是這個(gè)類的源代碼,辦法很簡(jiǎn)單,主要留意以下四點(diǎn):
該類保管一切配置類對(duì)象。
添加配置時(shí),該配置將注冊(cè)到一切配置類對(duì)象。
getValidator()辦法只能由一個(gè)配置類重寫,並且只允許一個(gè)配置類返回一個(gè)Validator對(duì)象。
getMessageCodesResolver()辦法只能由一個(gè)配置類重寫,並且只允許一個(gè)配置類返回MessageCodesResolver對(duì)象。
WebMvcConfigurerComposite類完成WebMvcConfigurer {
//持有配置類對(duì)象
私有最終列表拜托= new ArrayList();
public void addWebMvcConfigurers(列表配置器){
假如(!CollectionUtils.isEmpty(配置器)){
this.delegates.addAll(配置器);
}
}
//添加配置時(shí),該配置將注冊(cè)到一切配置類對(duì)象。
@掩蓋
公共void配置途徑匹配(途徑匹配配置器配置器){
for(webmvcconfigure delegate:this . delegates){
delegate.configurePathMatch(配置器);
}
}
...
/**
*這種辦法需求留意。
*考證器必需是獨(dú)一的,也就是說,只允許一個(gè)配置重寫此辦法以返回考證器。
*假如有多個(gè),將會(huì)引發(fā)異常
*/
@掩蓋
公共考證器getValidator() {
選定的考證程序= null
for (WebMvcConfigurer配置器:this.delegates) {
validator validator = configurer . get validator();
if(考證器!= null) {
假如(選中!= null) {
拋出新的IllegalStateException("未找到獨(dú)一的考證程序:{" +
selected +","+validator+" } ";
}
selected =考證器;
}
}
返回所選內(nèi)容;
}
/**
*這個(gè)辦法也需求留意。
* MessageCodesResolver必需是獨(dú)一的,即,
*只允許一個(gè)配置重寫此辦法以返回MessageCodesResolver,多個(gè)配置將引發(fā)異常。
*/
@掩蓋
@Nullable
public MessageCodesResolver getMessageCodesResolver(){
MessageCodesResolver selected = null;
for (WebMvcConfigurer配置器:this.delegates) {
MessageCodesResolver MessageCodesResolver = configurer . getmessagecodesresolver();
if (messageCodesResolver!= null) {
假如(選中!= null) {
拋出新的IllegalStateException("未找到獨(dú)一的MessageCodesResolver
selected +","+messageCodesResolver+" } ";
}
selected = messageCodesResolver
}
}
返回所選內(nèi)容;
}
}
復(fù)製代碼
2022升級(jí)重學(xué)C++重構(gòu)你的C++知識(shí)體系19章
download:鏈接:https://pan.baidu.com/s/1Ma8wdTcqInLhCvcuUPkGyQ?pwd=5zd6
提取碼:5zd6
--來自百度網(wǎng)盤超級(jí)會(huì)員V5的分享