springboot-静态资源配置原理
生活随笔
收集整理的這篇文章主要介紹了
springboot-静态资源配置原理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
目錄
一、靜態資源配置原理
1.自動配置類
2.自動配置類的內部類
一、靜態資源配置原理
* SpringBoot啟動默認加載 xxxAutoConfiguration 類(自動配置類)
* SpringMVC功能的自動配置類 WebMvcAutoConfiguration,生效
1.自動配置類
@Configuration(proxyBeanMethods = false) // 不會被代理 @ConditionalOnWebApplication(type = Type.SERVLET) // 是servlet項目 @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class }) // 有這幾個類,導入springmvc的包就會有這幾個類 @ConditionalOnMissingBean(WebMvcConfigurationSupport.class) // 容器中沒有這個類型的組件時下面才會生效。(要全面接管springmvc) @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10) @AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class }) public class WebMvcAutoConfiguration {2.自動配置類的內部類
(1)配置文件的相關屬性和xxx進行了綁定。
WebMvcProperties==spring.mvc、ResourceProperties==spring.resources
@SuppressWarnings("deprecation") @Configuration(proxyBeanMethods = false) @Import(EnableWebMvcConfiguration.class) @EnableConfigurationProperties({ WebMvcProperties.class,org.springframework.boot.autoconfigure.web.ResourceProperties.class, WebProperties.class }) // 將配置文件與這幾個類綁定,并且導入到ioc容器中。 @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {(2)這個內部類只有一個有參構造器:
//有參構造器所有參數的值都會從容器中確定 //ResourceProperties resourceProperties;獲取和spring.resources綁定的所有的值的對象 //WebMvcProperties mvcProperties 獲取和spring.mvc綁定的所有的值的對象 //ListableBeanFactory beanFactory Spring的beanFactory //HttpMessageConverters 找到所有的HttpMessageConverters //ResourceHandlerRegistrationCustomizer 找到 資源處理器的自定義器。========= //DispatcherServletPath 路徑處理器 //ServletRegistrationBean 給應用注冊Servlet、Filter、Listener....public WebMvcAutoConfigurationAdapter(org.springframework.boot.autoconfigure.web.ResourceProperties resourceProperties,WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory,ObjectProvider<HttpMessageConverters> messageConvertersProvider,ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,ObjectProvider<DispatcherServletPath> dispatcherServletPath,ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {this.resourceProperties = resourceProperties.hasBeenCustomized() ? resourceProperties: webProperties.getResources();this.mvcProperties = mvcProperties;this.beanFactory = beanFactory;this.messageConvertersProvider = messageConvertersProvider;this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();this.dispatcherServletPath = dispatcherServletPath;this.servletRegistrations = servletRegistrations;this.mvcProperties.checkConfiguration(); }(3)資源處理的默認規則
@Override public void addResourceHandlers(ResourceHandlerRegistry registry) {// 如果配置isAddMappings 配置為false,下面所有配置都不生效,默認為true。if (!this.resourceProperties.isAddMappings()) {logger.debug("Default resource handling disabled");return;}// 緩存Duration cachePeriod = this.resourceProperties.getCache().getPeriod();CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();// webjars的規則,也可以緩存if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl).setUseLastModified(this.resourceProperties.getCache().isUseLastModified()));}// staticPathPattern配置的請求(默認是/**)String staticPathPattern = this.mvcProperties.getStaticPathPattern();if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl).setUseLastModified(this.resourceProperties.getCache().isUseLastModified()));} } spring:resources:add-mappings: false 禁用所有靜態資源規則 // 靜態資源默認的四個位置 @ConfigurationProperties(prefix = "spring.resources", ignoreUnknownFields = false) public class ResourceProperties {private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { "classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };/*** Locations of static resources. Defaults to classpath:[/META-INF/resources/,* /resources/, /static/, /public/].*/private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;(4)歡迎頁的處理規則
// HandlerMapping:處理器映射。保存了每一個Handler能處理哪些請求。 @Bean public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),this.mvcProperties.getStaticPathPattern());welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());return welcomePageHandlerMapping; }// new WelcomePageHandlerMapping WelcomePageHandlerMapping(TemplateAvailabilityProviders templateAvailabilityProviders,ApplicationContext applicationContext, Optional<Resource> welcomePage, String staticPathPattern) {//要用歡迎頁功能,靜態資源路徑必須是/**if (welcomePage.isPresent() && "/**".equals(staticPathPattern)) {logger.info("Adding welcome page: " + welcomePage.get());setRootViewName("forward:index.html");}else if (welcomeTemplateExists(templateAvailabilityProviders, applicationContext)) {// 調用Controller /indexlogger.info("Adding welcome page template: index");setRootViewName("index");} }(5)favicon
favicon跟代碼沒什么關系,是瀏覽器會自動發送/favicon.ico,進行查找favicon。
總結
以上是生活随笔為你收集整理的springboot-静态资源配置原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: springboot设置欢迎页
- 下一篇: springboot-拦截器的实现、执行