用300行代码剖析SpringMVC的核心原理

写在前面

本文的目的是使用300行代码实现Spring MVC 核心原理,读取配置文件,实现自己的ioc容器,实现依赖注入,再根据注解和对应的方法实例化HandlerMapping,更重要的是为之后的源码的阅读提供一个大概的轮廓.

实现的最终结果图 :
在这里插入图片描述

首先看这张流程图

Spring MVC 运行流程

总体实现分析

  1. 首先接收网页请求的是DispatcherServlet(前端控制器),这个前端控制器继承了HttpServlet, 所以继承了doGet和doPost方法,通过这个分发请求.
  2. HandlerMapping(处理器映射器),简单来看就是就是一个Map<访问的url,controller层对应的方法>
  3. 这里简单模拟了Spring的处理流程,获取到Handlermapping返回的method之后,直接在DispatcherServlet执行返回.
    可以看出我们的SpringMVC框架设计的主要任务就是DispatcherServlet.

DispatcherServlet详细实现分析 :

  1. 加载配置文件(web.xml),通过这个配置文件获得要扫描的路径
  2. 扫描相关的类,并将其的ClassName获取并保存到List
  3. 初始化扫描到的类,并将其放到IOC容器
  4. 进行依赖注入(DI)
  5. 初始化Handlermapping
  6. 调用阶段,调用doDispatch()进行分发

现在开始

详细代码将会单独列出
在这里插入图片描述


总体概览

  @Override
    public void init(ServletConfig config) throws ServletException {
   
        // 初始化阶段
        //1.加载配置文件
        //ServletConfig通过这个可以获得web.xml中的信息
        // 拿到路径值
        doLoadConfig(config.getInitParameter("contextConfigLocation"));
        //2. 扫描相关的类
        doScanner(contextConfig.getProperty("scanPackage"));
        // 3. 初始化扫描到的类,并且将其放入IOC容器之中
        doInstance();
        // 4. 完成依赖注入
        doAutowired();
        //5. 初始化HandlerMappering
        initHandlermapping();
        System.out.println("MIMO Spring framework is init .");
    }
  1. 加载配置文件
    这一步的主要实现了将application.properties文件转换为输入流对象.并传给一个Properties对象[一种使用键值对保存信息的对象]
 private void doLoadConfig(String contextConfigLocation) {
   
        // 读取application.properties文件,并将转换为Properties对象
        InputStream fis = null;
        fis = this.getClass().getClassLoader().getResourceAsStream(contextConfigLocation);
        try {
   
            contextConfig.load(fis);
        } catch (IOException e) {
   
            e.printStackTrace();
        }
    }
  1. 扫描相关的类
    这一步的目的是获得所有的类的className的classNames’List
 /**
     * 扫描出相关的类
     *
     * @param scanPackage
     */
    private void    doScanner(String scanPackage) {
   
        //scanPackage=com.gupaoedu.demo是包路径
        //装换为文件路径,将'.'替换为'/'
        //这里是replaceall记住要全部进行替换
        URL url = this.getClass().getClassLoader().getResource("/" + scanPackage.replaceAll("\\.", "/"));
        File classpath = new File(url.getFile());
        //遍历classpath下的所有文件
        for (File file : classpath.listFiles()
        ) {
   
            if (file.isDirectory()) {
   // 判断是否为一个文件夹,递归,传入父类名+.+文件夹名
                doScanner(scanPackage + "." + file.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值