2022升级百度大牛带你结合实践重学C++含资料

download:2022升级百度大牛带你结合实践重学C++含资料

5 Spring5源代码16-@EnableWebMvc注释原理
1.需求和運用
一旦我們將九個自定義組件放入容器,DispatcherServlet就會初始化,以查看容器中能否有我們本人的組件,因而我們不需求本人的默許組件。我們的許多默許功用都喪失了。
我們的希冀:

您本人的組件能夠生效。
SpringMVC的默許還是管用的。
能夠運用@ enablewemvc+webmvconfiguration。@EnableWebMVC會導入9個組件到容器中,並且都有條目【我們能夠用WebMvcConfigurer自定義】,而不是默許運用配置文件。

2.@EnableWebMvc
@保存(RetentionPolicy。運轉時間)
@Target(ElementType。類型)
@已記载
@ Import(delegatingwebmvc configuration . class)
public @interface EnableWebMvc {
}
復製代码

我們發現,實践上是經過@Import注释在容器中注册了一個組件delegatingwebmvconfiguration,所以如今的中心是delegatingwebmvconfiguration類做了什麼?

3.拜托web MVC配置

兩個感知接口自動將ApplicationContext對象和ServletContext對象注入該組件。如今我們要帶著兩個問題來看看這類源代码?

爲什麼這個組件能夠讓自定義配置類生效?
爲此組件定義了哪些默許配置?

3.1拜托webmvconfiguration源代码
DelegatingWebMvcConfiguration類十分简單,只要一個字段配置器,它保管一切的配置類對象。另外要留意一個辦法,set configurator(list configurator)辦法,用@Autowired(required = false)注释,會自動執行。
@ Configuration(proxybean methods = false)
公共類拜托WebMvcConfiguration擴展WebMvcConfigurationSupport {

//組合形式,組合一切配置類。
private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();

/**
*此處添加了注释@Autowired(必填= false)。
*然前方法將在屬性填充階段執行,其中辦法參數來自容器。
*會自動沈著器中找到匹配類型的bean,然後反映執行辦法。
*/
@自動連線(必需=假)
公共void匯合配置器(列表配置器){
假如(!CollectionUtils.isEmpty(配置器)){
//將容器中的一切WebMvcConfigurer對象放入WebMvcConfigurerComposite
this . configurers . addwebmvc configurers(配置器);
}
}

/**/

/**
*以下辦法相似。
*向WebMvcConfigurerComposite的每個配置類添加配置的詳細過程參見3.1.1。
*/
@掩蓋
受維護的void配置途径匹配(途径匹配配置器配置器){
this . configurers . configurepathmatch(configurer);
}

...

/**/

//此辦法將獲取配置類定義的獨一考證程序。
@掩蓋
@Nullable
受維護的考證程序getValidator() {
返回this . configurers . get validator();
}

//此辦法將獲取配置類定義的獨一MessageCodesResolver。
@掩蓋
@Nullable
受維護的MessageCodesResolver getMessageCodesResolver(){
返回this . configurers . getmessagecodesresolver();
}
}
復製代码
能夠看到,在DelegatingWebMvcConfiguration組件的屬性填充階段,會自動找到容器中一切類型爲WebMvcConfigurer的bean對象,然後以它們爲參數調用set configurators(list configurators)辦法,一切配置類對象都會放入WebMvcConfigurerComposite中。
此外,它還重寫了父類的一些辦法(模板辦法形式)來向配置類注册配置,並獲取配置類中的一些配置對象,如Validator或MessageCodesResolver。
3.2 WebMvcConfigurerComposite
下面是這個類的源代码,辦法很简單,主要留意以下四點:

該類保管一切配置類對象。
添加配置時,該配置將注册到一切配置類對象。
getValidator()辦法只能由一個配置類重寫,並且只允許一個配置類返回一個Validator對象。
getMessageCodesResolver()辦法只能由一個配置類重寫,並且只允許一個配置類返回MessageCodesResolver對象。

WebMvcConfigurerComposite類完成WebMvcConfigurer {

//持有配置類對象
私有最終列表拜托= new ArrayList();

public void addWebMvcConfigurers(列表配置器){
假如(!CollectionUtils.isEmpty(配置器)){
this.delegates.addAll(配置器);
}
}

//添加配置時,該配置將注册到一切配置類對象。
@掩蓋
公共void配置途径匹配(途径匹配配置器配置器){
for(webmvcconfigure delegate:this . delegates){
delegate.configurePathMatch(配置器);
}
}

...

/**
*這種辦法需求留意。
*考證器必需是獨一的,也就是說,只允許一個配置重寫此辦法以返回考證器。
*假如有多個,將會引發異常
*/
@掩蓋
公共考證器getValidator() {
選定的考證程序= null
for (WebMvcConfigurer配置器:this.delegates) {
validator validator = configurer . get validator();
if(考證器!= null) {
假如(選中!= null) {
抛出新的IllegalStateException("未找到獨一的考證程序:{" +
selected +","+validator+" } ";
}
selected =考證器;
}
}
返回所選内容;
}

/**
*這個辦法也需求留意。

  • MessageCodesResolver必需是獨一的,即,
    *只允許一個配置重寫此辦法以返回MessageCodesResolver,多個配置將引發異常。
    */
    @掩蓋
    @Nullable
    public MessageCodesResolver getMessageCodesResolver(){
    MessageCodesResolver selected = null;
    for (WebMvcConfigurer配置器:this.delegates) {
    MessageCodesResolver MessageCodesResolver = configurer . getmessagecodesresolver();
    if (messageCodesResolver!= null) {
    假如(選中!= null) {
    抛出新的IllegalStateException("未找到獨一的MessageCodesResolver
    selected +","+messageCodesResolver+" } ";
    }
    selected = messageCodesResolver
    }
    }
    返回所選内容;
    }

}
復製代码

你可能感兴趣的:(c++)