网站排行,wordpress主题出售,济南市住监局官网,ajax做购物网站前言
我们也知道springboot启用springmvc基本不用做什么配置可以很方便就使用了但是不了解原理,开发过程中遇到点问题估计就比较头疼,不管了解的深不深入,先巴拉一番再说… 下面我们先看看官网…我的版本是2.3.2版本,发现官网改动也比较大…不同版本自己巴拉下吧,结构虽然变化…前言
我们也知道springboot启用springmvc基本不用做什么配置可以很方便就使用了但是不了解原理,开发过程中遇到点问题估计就比较头疼,不管了解的深不深入,先巴拉一番再说… 下面我们先看看官网…我的版本是2.3.2版本,发现官网改动也比较大…不同版本自己巴拉下吧,结构虽然变化了,但是内容变的不是很多… 有变动的 都标有: covered later in this document
springmvc 自动配置原理
官网上说明 自动配置在Spring的默认设置之上添加了以下功能
ContentNegotiatingViewResolver and BeanNameViewResolver 这2个bean 配置在WebMvcAutoConfiguration中
自动配置了ViewResolver视图解析器根据方法的返回值得到视图对象View视图对象决定如何渲染转发重定向ContentNegotiatingViewResolver组合所有的视图解析器的如何定制我们可以自己给容器中添加一个视图解析器自动的将其组合进来代码
SpringBootApplication
public class ComWebApplication {public static void main(String[] args) {SpringApplication.run(ComWebApplication.class, args);}Beanpublic ViewResolver myViewReolver(){return new MyViewResolver();}public static class MyViewResolver implements ViewResolver{Overridepublic View resolveViewName(String viewName, Locale locale) throws Exception {return null;}}}Support for serving static resources, including support for WebJars (see below).静态资源文件夹路径,webjars 在静态资源映射规则中已经讲解自动注册了 of Converter , GenericConverter , Formatter beans. Converter转换器 public String hello(User user)类型转换使用Converter Formatter 格式化器 2017.12.17Date
public void addFormatters(FormatterRegistry registry) {ApplicationConversionService.addBeans(registry, this.beanFactory);}自己添加的格式化器转换器我们只需要放在容器中即可 HttpMessageConverterSpringMVC用来转换Http请求和响应的User—Json -HttpMessageConverters 是从容器中确定获取所有的HttpMessageConverter 自己给容器中添加HttpMessageConverter只需要将自己的组件注册容器中Bean,Component Automatic registration of MessageCodesResolver (see below).定义错误代码生成规则 Static index.html support. 静态首页 在静态资源映射规则中已经讲解 Custom Favicon support (covered later in this document). favicon.icon 在静态资源映射规则中已经讲解 Automatic use of a ConfigurableWebBindingInitializer bean (see below). 我们可以配置一个ConfigurableWebBindingInitializer来替换默认的添加到容器 初始化WebDataBinder 请求数据JavaBean springmvc 扩展
springboot 自动配置远远不能满足我们的开发生产需要所以我们自己需要扩展一些功能 比如我们原来在springmvc的配置文件中写的 mvc:view‐controller path/hello view‐namesuccess/mvc:interceptorsmvc:interceptormvc:mapping path/hello/bean/bean/mvc:interceptor/mvc:interceptors我们都需要进行根据实际需要进行配置 If you want to keep those Spring Boot MVC customizations and make more MVC customizations (interceptors, formatters, view controllers, and other features), you can add your own Configuration class of type WebMvcConfigurer but without EnableWebMvc.
如果要保留这些Spring Boot MVC定制并进行更多的MVC定制拦截器格式化程序视图控制器和其他功能则可以添加自己的类型为WebMvcConfigurer的Configuration类但不添加EnableWebMvc。
Configuration
public class MySpringMvcConfig implements WebMvcConfigurer {Overridepublic void addViewControllers(ViewControllerRegistry registry) {//浏览器发送hello 跳转到success页面registry.addViewController(/hello).setViewName(success);}
}
编写一个配置类Configuration是WebMvcConfigurer 类型不能标注EnableWebMvc;老版本是WebMvcConfigurerAdapter,这个是抽象类没有都是空方法 既保留了所有的自动配置也能用我们扩展的配置
我们一探究竟
原理:
WebMvcAutoConfiguration是SpringMVC的自动配置类、在做其他自动配置时会导入Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
Configuration(proxyBeanMethods false)Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})EnableConfigurationProperties({WebMvcProperties.class, ResourceProperties.class})Order(0)public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {EnableWebMvcConfiguration类 Configuration(proxyBeanMethods false)public static class EnableWebMvcConfiguration extends DelegatingWebMvcConfiguration implements ResourceLoaderAware {private final ResourceProperties resourceProperties;EnableWebMvcConfiguration父类中
public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {private final WebMvcConfigurerComposite configurers new WebMvcConfigurerComposite();public DelegatingWebMvcConfiguration() {}//从容器中获取所有的WebMvcConfigurerAutowired(required false)public void setConfigurers(ListWebMvcConfigurer configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.configurers.addWebMvcConfigurers(configurers);}}//将所有的WebMvcConfigurer相关配置都来一起调用
public void addWebMvcConfigurers(ListWebMvcConfigurer configurers) {if (!CollectionUtils.isEmpty(configurers)) {this.delegates.addAll(configurers);}}、容器中所有的WebMvcConfigurer都会一起起作用 、我们的配置类也会被调用 效果SpringMVC的自动配置和我们的扩展配置都会起作用 注意这里说的都会起作用是说的针对不同的配置,比如是配置的静态文件映射,有的是viewController等等这些一起起作用
WebMvcRegistrations
如果要提供RequestMappingHandlerMappingRequestMappingHandlerAdapter或ExceptionHandlerExceptionResolver的自定义实例并且仍然保留Spring Boot MVC自定义则可以声明WebMvcRegistrations类型的Bean并使用它提供这些组件的自定义实例。
完全控制springmvc
If you want to take complete control of Spring MVC, you can add your own Configuration annotated with EnableWebMvc, or alternatively add your own Configuration-annotated DelegatingWebMvcConfiguration as described in the Javadoc of EnableWebMvc. 如果要完全控制Spring MVC则可以添加用EnableWebMvc注释的自己的Configuration或者按照EnableWebMvc的Javadoc中的说明添加自己的Configuration注释的DelegatingWebMvcConfiguration。
原理:
为什么EnableWebMvc自动配置就失效了
EnableWebMvc
Import({DelegatingWebMvcConfiguration.class})
public interface EnableWebMvc {
}public class DelegatingWebMvcConfiguration extends WebMvcConfigurationSupport {这样看来是说明我们导入了WebMvcConfigurationSupport
WebMvcAutoConfiguration 这个类我们知道是springmvc自动配置的核心类,在没有WebMvcConfigurationSupport这组件的时候才起作用
ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class})
ConditionalOnMissingBean({WebMvcConfigurationSupport.class})
AutoConfigureOrder(-2147483638)
AutoConfigureAfter({DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class})
public class WebMvcAutoConfiguration {这么说来我们目前知道WebMvcAutoConfiguration类以及失效了
、导入的WebMvcConfigurationSupport只是SpringMVC最基本的功能
如何修改SpringBoot的默认配置
模式 1、SpringBoot在自动配置很多组件的时候先看容器中有没有用户自己配置的Bean、Component如果有就用用户配置的如果没有才自动配置如果有些组件可以有多个ViewResolver将用户配置的和自己默认的组合起来 2、在SpringBoot中会有非常多的xxxConfigurer帮助我们进行扩展配置 3、在SpringBoot中会有很多的xxxCustomizer帮助我们进行定制配置