您好,欢迎访问一九零五行业门户网

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
dispatcherservletconfigurationdispatcherservletconfiguration是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<multipartconfigelement> 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怎么实现的详细内容。
其它类似信息

推荐信息