Spring MVC 教程-源码解析SpringMVC容器的启动过程

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【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. 阶段1:Servlet容器初始化
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值