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

37次阅读

共计 3223 个字符,预计需要花费 9 分钟才能阅读完成。

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
    }
    }
    返回所選内容;
    }

}
復製代码

正文完
 0