Spring Boot WEB相关配置

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

1 Spring Boot提供的自动配置

通过查看WebMvcAutoConfiguration及WebMvcProperties的源码,可以发现Spring Boot为我们提供了如下的自动配置。

1.自动配置的ViewResolver

(1) ContentNegotiatingViewResolver 这是Spring MVC提供的一个特殊的ViewResolver,ContentNegotiatingViewResolver不是自己处理View,而是代理给不同的ViewResolver来处理不同的View,所以它有最高的优先级。

(2) BeanNameViewResolver 在控制器(@Controller)中的一个方法的返回值的字符串(视图名)会根据BeanNameViewResolver去查找Bean的名称为返回字符串的View来渲染视图。是不是不好理解,下面举个小例子。 定义BeanNameViewResolver的Bean:

    @Bean
    public BeanNameViewResolver beanNameViewResolver() { 
        BeanNameViewResolver resolver = new BeanNameViewResolver();
        return resolver;
    }

定义一个View的Bean,名称为jsonView:

    @Bean
    public MappingJackson2JsonView jsonView(){
        MappingJackson2JsonView jsonView = new MappingJackson2JsonView();
        return jsonView;
    }

在控制器中,返回值为字符串jsonView,它会找Bean的名称为jsonView的视图来渲染:

    @RequestMapping(value = "/json",produces={MediaType.APPLICATION_JSON_VALUE}) 
    public String json(Model model) {
        Person single = new Person("aa",11); 
        model.addAttribute("single", single); 
        return "jsonView"; 
    }

(3)InternalResourceViewResolver 这个是一个极为常用的ViewResolver,主要通过设置前缀、后缀,以及控制器中方法来返回视图名的字符串,以得到实际页面,Spring Boot的源码如下:

    @Bean
    @ConditionalOnMissingBean
    public InternalResourceViewResolver defaultViewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix(this.mvcProperties.getView().getPrefix());
        resolver.setSuffix(this.mvcProperties.getView().getSuffix());
        return resolver;
    }

2.自动配置的静态资源

在自动配置类的addResourceHandlers方法中定义了以下静态资源的自动配置。

(1)类路径文件

把类路径下的/static、/public、/resources和/META-INF/resources文件夹下的静态文件直接映射为/**,可以通过http://localhost:8080/**来访问。

(2)webjar

何谓webjar,webjar就是将我们常用的脚本框架封装在jar包中的jar包,更多关于webjar的内容请访问http://www.webjars.org网站。

把webjar的/META-INF/resources/webjars/下的静态文件映射为/webjar/**,可以通过http://localhost:8080/webjar/**来访问。

3.自动配置的Formatter和Converter

关于自动配置Formatter和Converter,我们可以看一下WebMvcAutoConfiguration类中的定义:

    @Override
    public void addFormatters(FormatterRegistry registry) {
        for (Converter<?, ?> converter : getBeansOfType(Converter.class)) {
            registry.addConverter(converter);
        }
        for (GenericConverter converter : getBeansOfType(GenericConverter.class)) {
            registry.addConverter(converter);
        }
        for (Formatter<?> formatter : getBeansOfType(Formatter.class)) {
            registry.addFormatter(formatter);
        }
    }

    private <T> Collection<T> getBeansOfType(Class<T> type) {
        return this.beanFactory.getBeansOfType(type).values();
    }

从代码中可以看出,只要我们定义了Converter、GenericConverter和Formatter接口的实现类的Bean,这些Bean就会自动注册到Spring MVC中。

4.自动配置的HttpMessageConverters

在WebMvcAutoConfiguration中,我们注册了messageConverters,代码如下:

    @Autowired private HttpMessageConverters messageConverters;

    @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.addAll(this.messageConverters.getConverters());
    }

在这里直接注入了HttpMessageConverters的Bean,而这个Bean是在HttpMessageConvertersAutoConfiguration类中定义的,我们自动注册的HttpMessage Converter除了Spring MVC默认的ByteArrayHttpMessageConverter、StringHttpMessage Converter、Resource HttpMessageConverter、SourceHttpMessageConverter、AllEncompassing FormHttpMessageConverter外,在我们的HttpMessageConverters AutoConfiguration的自动配置文件里还引入了JacksonHttpMessageConverters Configuration和GsonHttpMessage ConverterConfiguration,使我们获得了额外的HttpMessageConverter:

  • 若jackson的jar包在类路径上,则Spring Boot通过JacksonHttpMessage Converters Configuration增加MappingJackson2HttpMessage Converter和Mapping Jackson2 XmlHttpMessageConverter;
  • 若gson的jar包在类路径上,则Spring Boot通过GsonHttpMessageConverter Configuration增加GsonHttpMessageConverter。

在Spring Boot中,如果要新增自定义的HttpMessageConverter,则只需定义一个你自己的HttpMessageConverters的Bean,然后在此Bean中注册自定义HttpMessageConverter即可,例如:

    @Bean
    public HttpMessageConverters customConverters() { 
        HttpMessageConverter<?> customConverter1= new CustomConverter1(); 
        HttpMessageConverter<?> customConverter2= new CustomConverter2(); 
        return new HttpMessageConverters(customConverter1, customConverter2); 
    }

5.静态首页的支持

把静态index.html文件放置在如下目录。

  • classpath:/META-INF/resources/index.html
  • classpath:/resources/index.html
  • classpath:/static/index.html
  • classpath:/public/index.html

2 接管Spring Boot的Web配置

如果Spring Boot提供的Spring MVC不符合要求,则可以通过一个配置类(注解有@Configuration的类)加上@EnableWebMvc注解来实现完全自己控制的MVC配置。

当然,通常情况下,Spring Boot的自动配置是符合我们大多数需求的。在你既需要保留Spring Boot提供的便利,又需要增加自己的额外的配置的时候,可以定义一个配置类并继承WebMvcConfigurerAdapter,无须使用@EnableWebMvc注解,然后按照第4章讲解的Spring MVC的配置方法来添加Spring Boot为我们所做的其他配置,例如:

    @Configuration 
    public class WebMvcConfig  extends WebMvcConfigurerAdapter{ 
        @Override 
        public void addViewControllers(ViewControllerRegistry registry) { 
            registry.addViewController("/xx").setViewName("/xx"); 
        }
    }

值得指出的是,在这里重写的addViewControllers方法,并不会覆盖WebMvcAutoConfiguration中的addViewControllers(在此方法中,Spring Boot将“/”映射至index.html),这也就意味着我们自己的配置和Spring Boot的自动配置同时有效,这也是我们推荐添加自己的MVC配置的方式。

3 注册Servlet、Filter、Listener

当使用嵌入式的Servlet容器(Tomcat、Jetty等)时,我们通过将Servlet、Filter和Listener声明为Spring Bean而达到注册的效果;或者注册ServletRegistrationBean、FilterRegistrationBean和ServletListenerRegistrationBean的Bean。

(1)直接注册Bean示例,代码如下:

    @Bean 
    public XxServlet xxServlet (){ 
        return new XxServlet(); 
    } 
    @Bean 
    public YyFilter yyFilter (){ 
        return new YyFilter(); 
    } 

    @Bean 
    public ZzListener zzListener (){ 
        return new ZzListener(); 
    }

(2)通过RegistrationBean示例:

    @Bean 
    public ServletRegistrationBean servletRegistrationBean(){ 
        return new ServletRegistrationBean(new XxServlet(),"/xx/*"); 
    } 
    @Bean 
    public FilterRegistrationBean filterRegistrationBean(){ 
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(); 
        registrationBean.setFilter( new YyFilter()); 
        registrationBean.setOrder(2); 
        return registrationBean; 
    } 

    @Bean 
    public ServletListenerRegistrationBean<ZzListener> zzListenerServletRegistrationBean(){ 
        return new ServletListenerRegistrationBean<ZzListener>(new ZzListener()); 
    }

来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » Spring Boot WEB相关配置

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏