Spring源码-------手写体验MVC

本文通过模拟实现Spring MVC,探讨自定义注解、反射机制、Spring Ioc容器及DI注解注入。详细介绍了配置、初始化和运行阶段,并提供了核心代码示例,总结了反射常用方法。
摘要由CSDN通过智能技术生成

Spring源码-------手写体验MVC 

目录

Spring源码-------手写体验MVC 

1、前言

2、Spring实现MVC的基本思路

3、实现MVC核心代码

4、总结


1、前言

本篇博客并非是对spring的原理进行深入的研究,而是通过模拟实现springmvc的功能来体验spring框架的强大之处。那么这篇博客涉及到的知识点大致有以下几点:

  • 如何自定义注解,如何通过反射机制去赋予注解强大的功能(说白了,就是体验在反射机制下,注解功能是多么的强大)
  • Spring Ioc容器的实现原理
  • Spring DI 注解注入
  • Java反射机制
  • Java I/O流(加载配置文件,读取配置文件信息) 

2、Spring实现MVC的基本思路

从下图可以大概知道,对于springmvc的实现大致分为三个阶段:配置阶段、初始化阶段、运行阶段。

配置阶段:

  • 配置web.xml文件
  • 设定init-param参数
  • 设定url-pattern规则
  • 配置Annotation注解

初始化阶段:

  • 调用Servlet init()方法
  • 加载配置文件
  • 扫描相关的类
  • IoC容器初始化,创建实例化对象(反射机制)并保存至容器
  • 进行DI操作,扫描IoC容器中的实例,进行属性自动赋值
  • 初始化HandlerMapping,将一个URL和一个Method进行一对一的关联映射

运行阶段:

  • 调用doPost()/doGet()方法,获得Request/Response对象
  • 匹配HandlerMapping,从request对象中获得用户输入的url找到对应的method
  • 反射调用method.invoke()方法并返回结果
  • response.getWriter().writer(),将返回结果输出到浏览器

3、实现MVC核心代码

3.1 首先建立一个Maven工程,然后引入相关的依赖和相关的配置,比如web.xml,application.properties等配置文件

大致结构如下:具体项目代码连接:

 

3.2 自定义注解和控制器和服务层

(1)注解

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZPSAutowired {

    String value() default "";

}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZPSController {

    String value() default "";

}

@Target({ElementType.TYPE , ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZPSRequestMapping {

    String value() default "";

}

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZPSRequestParam {

    String value() default "";

}

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ZPSService {

    String value() default "";

}

(2)service层

public interface DemoService {

      String getMsg(String msg);

}

/**
 * @description: 服务
 * @author: zps
 * @create: 2020-05-07 15:51
 **/
@ZPSService
public class DemoImp implements DemoService {

    @Override
    public String getMsg(String msg) {
        return "==========="+ msg + "==============";
    }

}

(3)控制层

/**
 * @description: 测试控制
 * @author: zps
 * @create: 2020-05-07 15:53
 **/

@ZPSController
@ZPSRequestMapping("/test")
public class DemoController {

    @ZPSAutowired
    private DemoService demoService;

    @ZPSRequestMapping("/add")
    public void add(HttpServletRequest req, HttpServletResponse resp,
                    @ZPSRequestParam("a") Integer a, @ZPSRequestParam("b") Integer b){
        try {
            resp.getWriter().write(a + "+" + b + "=" + (a + b));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    @ZPSRequestMapping("/hello")
    public String test(){
        return demoService.getMsg("Success!");
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值