交流
商城
MCN
登入
注册
首页
提问
分享
讨论
建议
公告
动态
发表新帖
发表新帖
springmvc第1-1 章:DispatcherServletRegistrationBean
分享
未结
0
1657
李延
LV6
2021-05-23
悬赏:20积分
# 作用 在上一步中我们看到springmvc最终是通过这个类的onStartup方法添加了Servlet。 我们这一章就详细说明一下,DispatcherServletRegistrationBean是在哪里进行了初始化以及它的详细内容。 # 创建 在启动的文章中,我们看到spring最终是通过BeanFactory获取到DispatcherServletRegistrationBean对象,并完成Servlet的加载的。 但DispatcherServletRegistrationBean又是在哪一步加载到BeanFactory中的。我下面说明 我们在DispatcherServletAutoConfiguration 这个类中看到sprignmvc通过@Bean注解创建出了DispatcherServletRegistrationBean。而方法中需要一个参数:DispatcherServlet,同样也是在这个类中创建。我们之后解析 ```java @Configuration(proxyBeanMethods = false) @Conditional(DispatcherServletRegistrationCondition.class) @ConditionalOnClass(ServletRegistration.class) @EnableConfigurationProperties(WebMvcProperties.class) @Import(DispatcherServletConfiguration.class) 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; } } ``` # 继承关系  ## ServletContextInitializer 顶级接口,只有一个方法 onStartup。也就是我们之前调用的方法,这个是我们重点关注的对象。 ## RegistrationBean 抽象类,实现了onStartup方法 ```java @Override public final void onStartup(ServletContext servletContext) throws ServletException { String description = getDescription(); if (!isEnabled()) { logger.info(StringUtils.capitalize(description) + " was not registered (disabled)"); return; } register(description, servletContext); } ``` 我们看到调用了两个方法 - getDescription 获取描述 - register 注册servlet 但getDescription 与 register 都是抽象方法子类实现 ## DynamicRegistrationBean ```java @Override protected final void register(String description, ServletContext servletContext) { D registration = addRegistration(description, servletContext); if (registration == null) { logger.info(StringUtils.capitalize(description) + " was not registered (possibly already registered?)"); return; } configure(registration); } ``` 我们看到servclet的又交给了addRegistration方法处理 ## ServletRegistrationBean ### getDescription ```java @Override protected String getDescription() { Assert.notNull(this.servlet, "Servlet must not be null"); return "servlet " + getServletName(); } ``` 这里实现了getDescription,就是servlet 加 Servlet的名称 ### addRegistration ```java @Override protected ServletRegistration.Dynamic addRegistration(String description, ServletContext servletContext) { String name = getServletName(); return servletContext.addServlet(name, this.servlet); } ``` 在这一步,我们看到了将servlet添加到context中。而servlet就是我们一开始参数传进来的DispatcherServlet对象。 # 总结 DispatcherServletRegistrationBean 总体来说,就是将DispatcherServlet注入到context中。
回帖
消灭零回复
提交回复
热议榜
java 相关知识分享
8
好的程序员与不好的程序员
6
写给工程师的十条精进原则
5
spring boot以jar包运行配置的logback日志文件没生成
5
一步一步分析SpringBoot启动源码(一)
5
MockMvc测试
5
【吐槽向】是不是有个吐槽的板块比较好玩
4
logstash jdbc同步mysql多表数据到elasticsearch
3
IntelliJ IDEA 优质License Server
3
.gitignore忽略规则
3
SpringBoot启动源码分析
3
一步一步分析SpringBoot启动源码(三)
3
2
一步一步分析SpringBoot启动源码(二)
2
积分不够将无法发表新帖
2
官方产品
Meta-Boot - 基于MCN
MCN - 快速构建SpringBoot应用
微信扫码关注公众号