作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO
联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬
学习必须往深处挖,挖的越深,基础越扎实!
阶段1、深入多线程
阶段2、深入多线程设计模式
阶段3、深入juc源码解析
码哥源码部分
码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】
码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】
码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】
码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】
打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】
本文将通过阅读源码的方式带大家了解springmv容器启动的过程,SpringMVC中的各种组件都是在容器启动的过程中组装的,所以如果熟悉整个过程后,你可以随意对SpringMVC进行扩展,SpringMVC会被你玩的出神入化。
1、前言
SpringMVC,建议大家使用全注解的方式
本文以全注解的方式为基础,来解说SpringMVC容器启动的整个流程。
2、回顾全注解方式2个关键类
全注解的方式重点就在于2个类:MVC初始化类、MVC配置类
2.1、MVC初始化类
代码如下,这个类需要继承AbstractAnnotationConfigDispatcherServletInitializer,会有web容器来调用,这个类中有4个方法需要实现,干了4件事情
- getRootConfigClasses():获取父容器的配置类
- getServletConfigClasses():获取springmvc容器的配置类,这个配置类相当于springmvc xml配置文件的功能
- getServletMappings():获取DispatcherServlet能够处理的url,相当于web.xml中为servlet指定的url-pattern
- getServletFilters():定义所有的Filter
/**
* ①:1、创建Mvc初始化类,需要继承AbstractAnnotationConfigDispatcherServletInitializer类
*/
public class MvcInit extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* springmvc容器的父容器spring配置类
* 实际工作中我们的项目比较复杂,可以将controller层放在springmvc容器中
* 其他层,如service层、dao层放在父容器了,bean管理起来更清晰一些
* 也可以没有父容器,将所有bean都放在springmvc容器中
*
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[0];
}
/**
* ②:2、设置springmvc容器的spring配置类
*
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{MvcConfig.class};
}
/**
* ③:3、配置DispatcherServlet的url-pattern
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* ④:4、注册拦截器
*
* @return
*/
@Override
protected Filter[] getServletFilters() {
//添加拦截器,解决乱码问题
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceRequestEncoding(true);
characterEncodingFilter.setForceResponseEncoding(true);
return new Filter[]{characterEncodingFilter};
}
}
2.2、MVC配置类
代码如下,这个配置类相当于springmvc xml配置文件的功能,可以在里面定义springmvc各种组件
/**
* 1.开启springmvc注解配置
* 2、配置视图解析器
* 3、配置截器
* 4、配置静态资源访问
* 5、配置文件上传解析器
* 6、配置全局异常处理器
*/
@Configuration
@ComponentScan("com.javacode2018.springmvc.chat12")
@EnableWebMvc //1:使用EnableWebMvc开启springmvc注解方式配置
public class MvcConfig implements WebMvcConfigurer {
/**
* 2、添加视图解析器(可以添加多个)
*
* @param registry
*/
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/view/");
resolver.setSuffix(".jsp");
resolver.setOrder(Ordered.LOWEST_PRECEDENCE);
registry.viewResolver(resolver);
}
@Autowired
private MyInterceptor myInterceptor;
/**
* 3、添加拦截器(可以添加多个)
*
* @param registry
*/
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(this.myInterceptor).addPathPatterns("/**");
}
/**
* 4、配置静态资源访问处理器
*
* @param registry
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}
/**
* 5、配置文件上传解析器
*
* @return
*/
@Bean
public CommonsMultipartResolver multipartResolver() {
CommonsMultipartResolver commonsMultipartResolver = new CommonsMultipartResolver();
//maxUploadSizePerFile:单个文件大小限制(byte)
//maxUploadSize:整个请求大小限制(byte)
commonsMultipartResolver.setMaxUploadSizePerFile(10 * 1024 * 1024);
commonsMultipartResolver.setMaxUploadSize(100 * 1024 * 1024);
return commonsMultipartResolver;
}
}
2、SpringMVC容器的生命周期(9个阶段)
- 阶段1:Servlet容器初始化
- 阶

最低0.47元/天 解锁文章
645

被折叠的 条评论
为什么被折叠?



