- 欢迎页原理
- 静态资源原理
关于静态资源原理和欢迎页原理,答案尽在spring-boot-autoconfigure-2.6.2.jar的org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration这个类里。
@Configuration( proxyBeanMethods = false ) @EnableConfigurationProperties({WebProperties.class}) public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware { private final Resources resourceProperties; private final WebMvcProperties mvcProperties; private final WebProperties webProperties; private final ListableBeanFactory beanFactory; private final WebMvcRegistrations mvcRegistrations; private ResourceLoader resourceLoader; public EnableWebMvcConfiguration(WebMvcProperties mvcProperties, WebProperties webProperties, ObjectProvidermvcRegistrationsProvider, ObjectProvider resourceHandlerRegistrationCustomizerProvider, ListableBeanFactory beanFactory) { this.resourceProperties = webProperties.getResources(); this.mvcProperties = mvcProperties; this.webProperties = webProperties; this.mvcRegistrations = (WebMvcRegistrations)mvcRegistrationsProvider.getIfUnique(); this.beanFactory = beanFactory; } @Bean public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext, FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) { WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, this.getWelcomePage(), this.mvcProperties.getStaticPathPattern()); welcomePageHandlerMapping.setInterceptors(this.getInterceptors(mvcConversionService, mvcResourceUrlProvider)); welcomePageHandlerMapping.setCorsConfigurations(this.getCorsConfigurations()); return welcomePageHandlerMapping; } }
- @Configuration,故 EnableWebMvcConfiguration 是一个配置类。
配置类如果只有一个有参构造函数,则构造函数的参数值全部从容器中获取。即参数WebMvcProperties mvcProperties、WebProperties webProperties的值全部从容器中获取。 - @EnableConfigurationProperties({WebProperties.class}),故EnableWebMvcConfiguration类的属性与类WebProperties绑定,可通过配置文件进行设置。
进入WebProperties,前缀为spring.web。
@ConfigurationProperties("spring.web") public class WebProperties {}
配置文件(如application.yml)中可对如下属性进行配置。
其中,
spring.web.resources.add-mappings,默认是true,如果设置为false,将禁用静态资源。
spring.web.resources.static-locations,默认静态资源目录为/static(或/public或/resources或/meta-INF/resources),当然也可以自定义。
spring.web.resources.cache.period,设置静态资源缓存时长,单位是秒。
在方法welcomePageHandlerMapping处打断点,调试看看。
@Configuration( proxyBeanMethods = false ) @import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class}) @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class}) @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware { private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class); private final Resources resourceProperties; private final WebMvcProperties mvcProperties; private final ListableBeanFactory beanFactory; private final ObjectProvidermessageConvertersProvider; private final ObjectProvider dispatcherServletPath; private final ObjectProvider > servletRegistrations; private final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; private ServletContext servletContext; public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider messageConvertersProvider, ObjectProvider resourceHandlerRegistrationCustomizerProvider, ObjectProvider dispatcherServletPath, ObjectProvider > servletRegistrations) { this.resourceProperties = webProperties.getResources(); this.mvcProperties = mvcProperties; this.beanFactory = beanFactory; this.messageConvertersProvider = messageConvertersProvider; this.resourceHandlerRegistrationCustomizer = (WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable(); this.dispatcherServletPath = dispatcherServletPath; this.servletRegistrations = servletRegistrations; this.mvcProperties.checkConfiguration(); } public void addResourceHandlers(ResourceHandlerRegistry registry) { if (!this.resourceProperties.isAddMappings()) { logger.debug("Default resource handling disabled"); } else { this.addResourceHandler(registry, "/webjars/**", "classpath:/meta-INF/resources/webjars/"); this.addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> { registration.addResourceLocations(this.resourceProperties.getStaticLocations()); if (this.servletContext != null) { ServletContextResource resource = new ServletContextResource(this.servletContext, "/"); registration.addResourceLocations(new Resource[]{resource}); } }); } } private void addResourceHandler(ResourceHandlerRegistry registry, String pattern, Consumer customizer) { if (!registry.hasMappingForPattern(pattern)) { ResourceHandlerRegistration registration = registry.addResourceHandler(new String[]{pattern}); customizer.accept(registration); registration.setCachePeriod(this.getSeconds(this.resourceProperties.getCache().getPeriod())); registration.setCacheControl(this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl()); registration.setUseLastModified(this.resourceProperties.getCache().isUseLastModified()); this.customizeResourceHandlerRegistration(registration); } } }
- @Configuration,故 WebMvcAutoConfigurationAdapter 是一个配置类。
配置类如果只有一个有参构造函数,则构造函数的参数值全部从容器中获取。即参数WebProperties webProperties、WebMvcProperties mvcProperties等值全部从容器中获取。 - @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class}),故WebMvcAutoConfigurationAdapter类的属性与类WebProperties、WebMvcProperties绑定,可通过配置文件进行设置。
WebProperties,刚刚在欢迎页的时候看过了。
接下来看看WebMvcProperties。
进入WebMvcProperties,前缀为spring.mvc。
@ConfigurationProperties( prefix = "spring.mvc" ) public class WebMvcProperties {}
配置文件(如application.yml)可对如下属性进行配置。
其中,spring.mvc.static-path-pattern用来设置静态资源访问路径,默认是/**。
在方法addResourceHandlers处打断点,调试瞧瞧。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)