web工程
一、SpringMVC自动化配置
-
视图解析器
内容协商视图解析器和BeanName视图解析器
-
静态资源
相当于SpringMVC中的开启默认Servlet
<mvc:default-servlet-handler/>
-
自动注册
格式化器Formatter,转换器Converter
-
自动配置HeepMessageConverters
-
静态页index.html发现支持
将index.html放在指定位置,可以自动发现
-
自定义Favicon(网站图标)
-
自动使用ConfigurableWebBindingInitializer
DataBinder负责将请求数据绑定到JavaBean上
二、静态资源访问
-
静态资源目录
在类路径下:/static /public /resources /META-INF/resources 等
访问:当前项目的根路径/ + 静态资源名
原理:在处理请求时,服务器先去controller中查找是否有对应的类,
如果没有,就会去静态资源中查找,如果静态资源中也没有,才会报404
-
改变静态资源访问前缀
默认的静态资源访问是无前缀的
在application.yaml中配置访问前缀
# 设置后,项目再去访问静态资源就变成:当前项目的根路径/src/ + 静态资源名 spring: mvc: static-path-pattern: /src/**
作用:可以在设置拦截器时,方便对于静态页面进行管理
-
改变默认的静态资源扫描路径
# springboot2.7之后 spring: webflux: static-path-pattern: ["classpath:/haha/"] # springboot2.3版本使用下面格式 # sping: # resources: # static-locations: [classpath:/haha/]
-
支持webjars
官网:WebJars - Web Libraries in Jars
把js/css等静态文件做成了jar包的形式,可以通过依赖的方式引入
-
欢迎页支持
可以在默认或设置了的静态资源目录下创建index.html,此时在浏览器输入项目的根路径后,就会直接跳转到该欢迎页面。
# 不能设置静态页面前缀 spring: # mvc: # static-path-pattern: /src/** webflux: static-path-pattern: ["classpath:/haha/"]
常规的欢迎页面是通过一个有@GetMapping(“/index”)标注的controller类去响应
三、Favicon
四、自动化配置的源码解析
-
在IDEA中查看springboot提供的自动配置类
自动配置类有很多,主要看关于springmvc的
-
有关spingmvc的自动配置
-
查看自动配置是否生效
@AutoConfiguration( after = {DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class, ValidationAutoConfiguration.class}) // 这个条件满足,本身就是servlet类型的 @ConditionalOnWebApplication( type = Type.SERVLET ) // 这三个类也都加载了,满足条件 @ConditionalOnClass({Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class}) // 这个条件现在满足。如果要全面接管springmvc的配置,才会加载这个类,进行私人定制。 @ConditionalOnMissingBean({WebMvcConfigurationSupport.class}) @AutoConfigureOrder(-2147483638) public class WebMvcAutoConfiguration { }
-
给容器中配了什么
就是在WebMvcAutoConfiguration类中查找有@Bean或@Configuration的方法或类,重点看一下配置类WebMvcAutoConfigurationAdapter
@Configuration(proxyBeanMethods = false) @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class}) @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class}) @Order(0) public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware { private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class); private final Resources resourceProperties; private final WebMvcProperties mvcProperties; private final ListableBeanFactory beanFactory; private final ObjectProvider<HttpMessageConverters> messageConvertersProvider; private final ObjectProvider<DispatcherServletPath> dispatcherServletPath; private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations; private final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer; private ServletContext servletContext;
主要看**@EnableConfigurationProperties**注解中的内容,表示配置文件和xxx的属性进行了绑定(容器功能的一种,参考SpringBoot二:容器功能(和Spring相关)_e_nanxu的博客-CSDN博客)
// 表示和yaml配置文件中的spring.mvc下的属性进行了绑定 @ConfigurationProperties( prefix = "spring.mvc" ) public class WebMvcProperties { }
// 表示和yaml配置文件中的spring.web下的属性进行了绑定 @ConfigurationProperties("spring.web") public class WebProperties { }
-
**注意:**一个配置类只有一个有参构造器,那么构造器内的所有参数的值都会从容器中确定
/* webProperties:获取和spring.rousources绑定的所有的值的对象 mvcProperties:获取和spring.mvc绑定的所有的值的对象 beanFactory: Spring的beanFactory messageConvertersProvider:找到所有的HttpMessageConverters resourceHandlerRegistrationCustomizerProvider:找到资源处理器的自定义器 dispatcherServletPath: servletRegistrations:给应用注册servlet、filter等 */ 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 = (WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable(); this.dispatcherServletPath = dispatcherServletPath; this.servletRegistrations = servletRegistrations; this.mvcProperties.checkConfiguration(); }