美文网首页
Spring Boot Web 开发

Spring Boot Web 开发

作者: Tinyspot | 来源:发表于2022-11-25 21:37 被阅读0次

    1. 静态资源访问

    1.1 静态资源目录

    /static, /public, /resources, /META-INF/resources
    默认映射路径是 /**/** 默认是拦截所有请求)

    classpath:/static
    classpath:/public
    classpath:/resources
    classpath:/META-INF/resources
    
    image.png

    请求地址 http://localhost:8888/public.jpg

    1.2 静态资源和动态资源地址一样

    请求优先找 Controller 处理,若不能处理,再找静态资源处理器
    可以指定拦截的前缀来访问静态资源

    2. 配置静态资源地址

    2.1 方式一:配置 application.yml

    spring:
      mvc:
        static-path-pattern: /static/** # 指定访问路径前缀
    

    请求地址 http://localhost:8888/static/public.jpg

    指定静态资源目录

    spring:
      mvc:
        static-path-pattern: /static/**
      web:
        resources:
          static-locations: classpath:/images,classpath:/static
    

    请求地址 http://localhost:8888/static/demo.jpg

    2.2 方式二:继承 WebMvcAutoConfiguration

    • Deprecated as of 5.0 WebMvcConfigurer has default methods
    • Spring Boot 2.0以后,该类被标记为@Deprecated(弃用)。官方推荐直接实现WebMvcConfigurer接口或者直接继承WebMvcConfigurationSupport类
    @Configuration
    public class WebConfig extends WebMvcConfigurerAdapter {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            // 将 /static/** 访问映射到/public/**
            registry.addResourceHandler("/static/**").addResourceLocations("classpath:/public/");
            // super.addResourceHandlers(registry);
        }
    }
    

    访问地址 http://localhost:8888/static/public.jpg

    2.3 方式三:WebMvcConfigurer

    @Configuration
    public class WebConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/img/**")
                    .addResourceLocations("classpath:/static/")
                    .addResourceLocations("classpath:/public/")
                    .addResourceLocations("classpath:/resources/");
        }
    }
    

    访问地址 http://localhost:8888/img/public.jpg

    3. 静态资源配置原理

    Spring Boot启动默认加载 xxxAutoConfiguration 类

    SpringMVC自动配置类org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

    @AutoConfiguration(after = { DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
            ValidationAutoConfiguration.class })
    @ConditionalOnWebApplication(type = Type.SERVLET)
    @ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
    @ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
    @AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
    public class WebMvcAutoConfiguration {
    
      public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
          public void addResourceHandlers(ResourceHandlerRegistry registry) {}
      }
    }
    

    配置类只有一个有参构造器,有参构造器所有参数的值都会从容器中确定

    @EnableConfigurationProperties({ WebMvcProperties.class, WebProperties.class })
    public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
      public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties,
                                          ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
                                          ObjectProvider<WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,
                                          ObjectProvider<DispatcherServletPath> dispatcherServletPath,
                                          ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
        this.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();
    }
    }
    

    配置文件相关属性绑定

    @ConfigurationProperties(prefix = "spring.mvc")
    public class WebMvcProperties {
    }
    @ConfigurationProperties("spring.web")
    public class WebProperties {
    }
    

    相关文章

      网友评论

          本文标题:Spring Boot Web 开发

          本文链接:https://www.haomeiwen.com/subject/mprqfdtx.html