SpringBoot---web-->>静态资源配置原理【快乐的源码】(1)

web---静态资源配置原理

所有的原理配置都是从SpringBoot启动时开始自动配置的

首先,找到spring-boot-autoconfigure-2.6.1.jar下的\org\springframework\boot\autoconfigure\web\servlet【web自动配置场景的servlet自动配置的包】

在里面发现了如:DispatcherServletAutoConfiguration请求控制器自动配置类、HttpEncodingAutoConfiguration请求编码过滤器自动配置类、MultipartAutoConfiguration文件上传解析器自动配置类、ServletWebServerFactoryAutoConfiguration、 ServletWebServerFactoryConfiguration、【服务器自动配置类】 WebMvcAutoConfiguration【SpringMvc的自动配置类】本次要看的

WebMvcAutoConfiguration

在WebMvcAutoConfiguration类中

//说自己是一个配置类
@Configuration(proxyBeanMethods = false)
//这个工程要是一个servlet工程,符合要求
@ConditionalOnWebApplication(type = Type.SERVLET)
//工程里面有没有Servlet、DispatcherServlet、WebMvcConfigurer这几个类,引入了SpringBoot依赖就有
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
//工程里面不能有WebMvcConfigurationSupport,这个条件符合后面才学
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class)
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
//在DispatcherServletAutoConfiguration、TaskExecutionAutoConfiguration、ValidationAutoConfiguration这些类加载完后再进行加载
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,
      ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}

条件都符合,进入源码观察方法和内部类

首先就是一些默认视图前缀、后缀、请求转换器等工具,这些自动配置工具方法都用了配置@ConditionalOnMissingBean,如果用户配置了boot就不用配置了

springMvc自动配置适配器

然后再往下看

这是一个内部类,他是SpringMvc的自动配置适配器,里面只有一个有参构造,这说明在加载这个方法时参数都会从容器中获取

​
//说自己是一个配置类
@Configuration(proxyBeanMethods = false)
//引入了EnableWebMvcConfiguration这个组件
@Import(EnableWebMvcConfiguration.class)
//将WebMvcProperties、WebProperties这两个类注册为组件然后将开启配置绑定
@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 ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
​
   private ServletContext servletContext;
​
    /*
    WebProperties webProperties--->> 从容其中拿和前缀为spring.web配置绑定的属性
     WebMvcProperties mvcProperties-->> 从容器拿和前缀spring.mvc配置绑定的属性
     ListableBeanFactory beanFactory -->> 从容器中获取ListableBeanFactory
     HttpMessageConverters--->>从容器中获取HttpMessageConverters
     ResourceHandlerRegistrationCustomizer---从容器中获取ResourceHandlerRegistrationCustomizer资源处理器的自定义器
     DispatcherServletPath--->>dispatcherservlet能处理的请求路径
     ServletRegistrationBean---注册原生servlet、filter、listern用的
    */
   public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties,
         ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,
         ObjectProvider<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();
   }
}

​

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值