Spring Boot实战(七)Spring Boot 的 Web 开发 7.3 Web相关配置

7.3.1 Spring Boot提供的自动配置
通过查看WebMvcAutoConfiguration及WebmvcProperties的源码,可以发现Spring Boot为我们提供了如下的自动配置。
1.自动配置的ViewResolver
(1)ContentNegotiatingViewResolver
这是Spring MVC提供的一个特殊的ViewResolver,ContentNegotiationViewResolver不是自己处理View,而是代理给不同的ViewResolver来处理不同的View,所以它有最高的优先级。
(2)BeanNameViewResolver
在控制器(@Controller)中的一个方法的返回值的字符串(视图名)会根据BeanNameViewResolver去查找Bean的名称为返回字符串的View来渲染视图。
(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,代码如下:


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

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

若jackson的jar包在类路径上,则Spring Boot通过JacksonHttpMessage Converters Configuration增加MappingJackson2HttpMessage Converter和Mapping Jackson2XmlHttpmessageConverter;
若gson的jar包在类路径上,则Spring Boot通过GsonHttpMessageConverter Configuration增加GsonHttpMessageConverter。
在Spring Boot中,如果要新增自定义的HttpMessageConverter,则只需定义一个你自己的HttpMessageConverter;

在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

当我们访问应用根目录http://localhost:8080/时,会直接映射。

7.3.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配置的方式。
7.3.3 注册Servlet、Filter、Listener
当使用嵌入式Servlet容器(Tomcat、Jetty等)时,我们通过将Servlet、Filter和Listeners声明为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());
}

猜你喜欢

转载自blog.csdn.net/qq_40929047/article/details/86660681