SpringBoot扩展和全面接管SpringMVC源码学习笔记

扩展SpringMVC

在这里插入图片描述

WebMvcConfigurer

		源码:
		//SpringMVC拓展配置,很多空方法
		public interface WebMvcConfigurer {
			
			//异步支持的
			default void configureAsyncSupport(AsyncSupportConfigurer configurer) {
			}
			
			//资源注册的
			default void addResourceHandlers(ResourceHandlerRegistry registry) {
			}
			
			//配置跨域的
			default void addCorsMappings(CorsRegistry registry) {
			}
		}

//WebMvcAutoConfiguration是SpringMVC的自动配置类

	@Configuration
	@ConditionalOnWebApplication(type = Type.SERVLET)
	@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
	@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
	@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
	@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
			ValidationAutoConfiguration.class })
	public class WebMvcAutoConfiguration {
		
		//SpringMVC的自动配置组件,也实现WebMvcConfigurer接口,添加组件
		@Configuration
		@Import(EnableWebMvcConfiguration.class)
		@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
		@Order(0)
		public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {
			
			//静态资源映射
			@Override
			public void addResourceHandlers(ResourceHandlerRegistry registry) {
			}
		}
		
		//SpringMVC的自动配置和我们的扩展配置都会起作用
		@Configuration
		public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {		
		}

DelegatingWebMvcConfiguration

			源码:
			//容器中所有WebMvcConfigurer都会一起起作用,我们自己写的配置类也会被调用
			@Configuration
			public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {
			
				private final WebMvcConfigurerComposite configurers = new WebMvcConfigurerComposite();
				
				//自动装配,从容器中获取所有的WebMvcConfigurer,把List<WebMvcConfigurer> configurers赋值到WebMvcConfigurerComposite configurers里
				@Autowired(required = false)
				public void setConfigurers(List<WebMvcConfigurer> configurers) {
					if (!CollectionUtils.isEmpty(configurers)) {
						this.configurers.addWebMvcConfigurers(configurers);
					}
				}
				
				//参考实现:添加视图映射,将所有的WebMvcConfigurer相关配置都来一起调用
				@Override
				protected void addViewControllers(ViewControllerRegistry registry) {
					this.configurers.addViewControllers(registry);
				}
			}

addViewControllers//添加视图映射

				源码:
				class WebMvcConfigurerComposite implements WebMvcConfigurer {

					//把容器中所有WebMvcConfigurer拿出来,addViewControllers方法都调出来
					@Override
					public void addViewControllers(ViewControllerRegistry registry) {
						for (WebMvcConfigurer delegate : this.delegates) {
							delegate.addViewControllers(registry);
						}
					}
				}
	}

全面接管SpringMVC

在这里插入图片描述

	@Configuration
	@ConditionalOnWebApplication(type = Type.SERVLET)
	@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
	//容器中没有这个组件的时候,这个自动配置类才生效
	@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
	@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
	@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
			ValidationAutoConfiguration.class })
	public class WebMvcAutoConfiguration { 
	}

@EnableWebMvc

		源码:
		@Retention(RetentionPolicy.RUNTIME)
		@Target(ElementType.TYPE)
		@Documented
		@Import(DelegatingWebMvcConfiguration.class)
		public @interface EnableWebMvc {
		}

DelegatingWebMvcConfiguration

			源码:
			@Configuration
			public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {

				@Autowired(required = false)
				public void setConfigurers(List<WebMvcConfigurer> configurers) {
					if (!CollectionUtils.isEmpty(configurers)) {
						this.configurers.addWebMvcConfigurers(configurers);
					}
				}
			}
			//SpringMVC帮我们做一些基本配置
			WebMvcConfigurationSupport
				源码:
				public class WebMvcConfigurationSupport implements ApplicationContextAware, ServletContextAware {				
				}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值