千家信息网

Springboot自动装配之注入DispatcherServlet怎么实现

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"Springboot自动装配之注入DispatcherServlet怎么实现",在日常操作中,相信很多人在Springboot自动装配之注入DispatcherServlet怎么实现
千家信息网最后更新 2026年10月31日Springboot自动装配之注入DispatcherServlet怎么实现

这篇文章主要介绍"Springboot自动装配之注入DispatcherServlet怎么实现",在日常操作中,相信很多人在Springboot自动装配之注入DispatcherServlet怎么实现问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"Springboot自动装配之注入DispatcherServlet怎么实现"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

原理概述

Springboot向外界提供web服务,底层依赖了springframework中的web模块(包含但不限于spring mvc核心类DispatcherServlet)来实现

那么springboot在什么时机向容器注入DispatcherServlet这个核心类的呢
注入的流程还是遵循了自动装配流程,在springboot框架里默认提供了该自动装配的支持

在jar包里的spring.factories文件里有个 org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration配置

@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)@Configuration(proxyBeanMethods = false)@ConditionalOnWebApplication(type = Type.SERVLET)@ConditionalOnClass(DispatcherServlet.class)@AutoConfigureAfter(ServletWebServerFactoryAutoConfiguration.class)public class DispatcherServletAutoConfiguration {        /*         * The bean name for a DispatcherServlet that will be mapped to the root URL "/"         */        public static final String DEFAULT_DISPATCHER_SERVLET_BEAN_NAME = "dispatcherServlet";        /*         * The bean name for a ServletRegistrationBean for the DispatcherServlet "/"         *        public static final String DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME = "dispatcherServletRegistration";        // ... 省略代码        }

在DispatcherServletAutoConfiguration中有两个内部类(配置类) DispatcherServletConfiguration、DispatcherServletRegistrationConfiguration和两个对应的Condition类DefaultDispatcherServletCondition、DispatcherServletRegistrationCondition

DispatcherServletConfiguration

DispatcherServletConfiguration是DispatcherServletAutoConfiguration 的一个内部类,并被 @Configuration标注,会被容器自动扫描到;其有两个方法: 1、dispatcherServlet;2、multipartResolver

    @Configuration(proxyBeanMethods = false)        @Conditional(DefaultDispatcherServletCondition.class)        @ConditionalOnClass(ServletRegistration.class)        @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class })        protected static class DispatcherServletConfiguration {// @A                @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)                public DispatcherServlet dispatcherServlet(HttpProperties httpProperties, WebMvcProperties webMvcProperties) {                        DispatcherServlet dispatcherServlet = new DispatcherServlet();                        dispatcherServlet.setDispatchOptionsRequest(webMvcProperties.isDispatchOptionsRequest());                        dispatcherServlet.setDispatchTraceRequest(webMvcProperties.isDispatchTraceRequest());                        dispatcherServlet.setThrowExceptionIfNoHandlerFound(webMvcProperties.isThrowExceptionIfNoHandlerFound());                        dispatcherServlet.setPublishEvents(webMvcProperties.isPublishRequestHandledEvents());                        dispatcherServlet.setEnableLoggingRequestDetails(httpProperties.isLogRequestDetails());                        return dispatcherServlet;                }// @B                @Bean                @ConditionalOnBean(MultipartResolver.class)                @ConditionalOnMissingBean(name = DispatcherServlet.MULTIPART_RESOLVER_BEAN_NAME)                public MultipartResolver multipartResolver(MultipartResolver resolver) {                        // Detect if the user has created a MultipartResolver but named it incorrectly                        return resolver;                }        }

@A:

  • @Configuration(proxyBeanMethods = false):配置类采用Lite模式

  • @Conditional(DefaultDispatcherServletCondition.class):根据DefaultDispatcherServletCondition类返回值计算是否要注入,主要逻辑是检验Spring容器中是否已经存在一个名字为"dispatcherServlet"的DispatcherServlet

  • @ConditionalOnClass(ServletRegistration.class):容器中必须要有ServletRegistration类

  • @EnableConfigurationProperties({ HttpProperties.class, WebMvcProperties.class }):加载HttpProperties和WebMvcProperties

@B:注入 MultipartResolver 解析类

DispatcherServletRegistrationConfiguration

该类注入的逻辑与DispatcherServletConfiguration 相同,只不过在类上注解了 @Import(DispatcherServletConfiguration.class)那么这两个类定义就有了先后顺序

@Configuration(proxyBeanMethods = false)        @Conditional(DispatcherServletRegistrationCondition.class)        @ConditionalOnClass(ServletRegistration.class)        @EnableConfigurationProperties(WebMvcProperties.class)        @Import(DispatcherServletConfiguration.class) //@A        protected static class DispatcherServletRegistrationConfiguration {                @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)                @ConditionalOnBean(value = DispatcherServlet.class, name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)                public DispatcherServletRegistrationBean dispatcherServletRegistration(DispatcherServlet dispatcherServlet,                                WebMvcProperties webMvcProperties, ObjectProvider multipartConfig) {                        DispatcherServletRegistrationBean registration = new DispatcherServletRegistrationBean(dispatcherServlet,                                        webMvcProperties.getServlet().getPath());                        // 设置名称                                    registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);                        registration.setLoadOnStartup(webMvcProperties.getServlet().getLoadOnStartup());                        multipartConfig.ifAvailable(registration::setMultipartConfig);                        return registration;                }        }

其中,DispatcherServletRegistrationBean继承自ServletRegistrationBean,主要为DispatcherServlet提供服务。DispatcherServletRegistrationBean和DispatcherServlet都提供了注册Servlet并公开DispatcherServletPath信息的功能

到此,关于"Springboot自动装配之注入DispatcherServlet怎么实现"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

装配 两个 容器 学习 配置 方法 更多 核心 流程 逻辑 帮助 服务 实用 相同 接下来 代码 信息 先后 功能 原理 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 百单网互联网科技有限公司怎么样 互联网是第几次科技革命的成果 盈实互联网科技 互联网科技的 互联网金融 科技金融 碳银互联网科技 世界互联网领先科技成果 广州互联网络科技有限公司 万达互联网科技 互联网科技生活的内容 互联网教育科技公司vipkid 央行互联网金融科技公司 银川新华互联网科技职业技术培训学校图片 汽车互联网创新科技园 苏州铭阳互联网科技有限公司 卓翼科技产业互联网合作 吉林省码上互联网科技电话 兰石爱特工业互联网科技分公司 三亚科技创新互联网基地 互联网科技创业计划的风险分析 互联网科技社 关于新基建和互联网科技 互联网科技公司怎么样 汇久创客互联网科技 撒么互联网科技公司 茂名市互联网科技产业园 互联网方面的科技前沿 黑云互联网科技有限公司 皮皮虾互联网科技有限公司 互联网风格科技公司名称
0