人见人爱的Spring已然不仅仅只是一个框架了。如今,Spring已然成为了一个生态。但深入了解Spring的却寥寥无几。这里,我带大家一起来看看,我是如何手写Spring的。我将结合对Spring十多年的研究经验,用不到400行代码来描述SpringIOC、DI、MVC的精华设计思想,并保证基本功能完整。
首先,我们先来介绍一下Spring的三个阶段,配置阶段、初始化阶段和运行阶段(如图):
配置阶段:主要是完成application.xml配置和Annotation配置。
初始化阶段:主要是加载并解析配置信息,然后,初始化IOC容器,完成容器的DI操作,已经完成HandlerMapping的初始化。
运行阶段:主要是完成Spring容器启动以后,完成用户请求的内部调度,并返回响应结果。
先来看看我们的项目结构(如下图)
一、配置阶段
我采用的是maven管理项目。先来看pom.xml文件中的配置,我只引用了servlet-api的依赖。
然后,创建GPDispatcherServlet类并继承HttpServlet,重写init()、doGet()和doPost()方法。
在web.xml文件中配置以下信息:
在<init-param>中,我们配置了一个初始化加载的Spring主配置文件路径,在原生框架中,我们应该配置的是classpath:application.xml。在这里,我们为了简化操作,用properties文件代替xml文件。以下是properties文件中的内容:
接下来,我们要配置注解。现在,我们不使用Spring的一针一线,所有注解全部自己手写。
创建GPController注解:
创建GPRequestMapping注解:
创建GPService注解:
创建GPAutowired注解:
创建GPRequestParam注释:
使用自定义注解进行配置:
到此,我们把配置阶段的代码全部手写完成。
二、初始化阶段
先在GPDispatcherServlet中声明几个成员变量:
当Servlet容器启动时,会调用GPDispatcherServlet的init()方法,从init方法的参数中,我们可以拿到主配置文件的路径,从能够读取到配置文件中的信息。前面我们已经介绍了Spring的三个阶段,现在来完成初始化阶段的代码。在init()方法中,定义好执行步骤,如下:如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java进阶群:725219329,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
doLoadConfig()方法的实现,将文件读取到Properties对象中:
doScanner()方法,递归扫描出所有的Class文件
doInstance()方法,初始化所有相关的类,并放入到IOC容器之中。IOC容器的key默认是类名首字母小写,如果是自己设置类名,则优先使用自定义的。因此,要先写一个针对类名首字母处理的工具方法。
然后,再处理相关的类。
doAutowired()方法,将初始化到IOC容器中的类,需要赋值的字段进行赋值
initHandlerMapping()方法,将GPRequestMapping中配置的信息和Method进行关联,并保存这些关系。
到此,初始化阶段的所有代码全部写完。
三、运行阶段
来到运行阶段,当用户发送请求被Servlet接受时,都会统一调用doPost方法,我先在doPost方法中再调用doDispach()方法,代码如下:
doDispatch()方法是这样写的:
到此,我们完成了一个mini版本的Spring,麻雀虽小,五脏俱全。我们把服务发布到web容器中,然后,在浏览器输入:http://localhost:8080/demo/query.json?name=Tom,就会得到下面的结果:如果想学习Java工程化、高性能及分布式、深入浅出。微服务、Spring,MyBatis,Netty源码分析的朋友可以加我的Java进阶群:725219329,群里有阿里大牛直播讲解技术,以及Java大型互联网技术的视频免费分享给大家。
当然,真正的Spring要复杂很多,但核心设计思路基本如此。例如:Spring中真正的HandlerMapping是这样的:
相关推荐
《Java EE企业级应用开发教程(Spring Spring MVC MyBatis)》是一本专注于Java企业级应用开发的专业教程,由黑马程序员编著。本书的核心在于深入浅出地介绍如何使用Java EE技术栈,特别是Spring、Spring MVC和...
Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)SSM源码Java EE企业级应用...
在本文中,我们将深入探讨如何使用JavaEE技术栈,特别是Spring、Spring MVC和MyBatis框架,来构建一个超市货物管理系统的实现。这个系统涵盖了基本的登录功能以及与MySQL数据库的交互,包括增删改查操作和分页显示。...
thymeleaf是一个支持html原型的自然引擎,它在html标签增加额外的属性来达到模板+数据的展示方式,由于浏览器解释html时,忽略未定义的标签属性,因此thymeleaf的模板可以静态运行。 由于thymeleaf在内存缓存解析后...
Spring MVC 是一个强大的Java Web开发框架,用于构建可维护、高性能和灵活的Web应用程序。它作为Spring框架的一部分,提供了一种模型-视图-控制器(MVC)架构,简化了处理HTTP请求和响应的复杂性。在这个基础实例中...
Spring MVC Portlet是一个用于构建portlet应用程序的框架,它结合了Spring MVC的灵活性和portlet规范的强大功能。在这个demo中,我们将会深入探讨如何利用Spring 3.0 MVC架构来开发portlet应用。 **Spring MVC简介*...
在《spring+mybatis企业应用实战》这本书中,读者可以学习到如何整合Spring MVC和MyBatis,创建一个完整的后端系统。书中的实例涵盖了以下内容: 1. Spring MVC和MyBatis的安装与配置,包括环境搭建和依赖管理。 2....
程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病程序员如何防止颈椎病...
【视频答疑】为什么做程序员头发还这么浓密?!
其核心特性还包括Spring MVC,这是一个用于构建Web应用的模型-视图-控制器(MVC)框架,它使得业务逻辑与展示层分离,提高了代码的可维护性和可测试性。 Spring MVC接收HTTP请求,通过DispatcherServlet进行调度,...
Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发,减少出错,方便组内开发人员之间...
《深入解析Spring MVCgn Web Flow》是Spring MVC 和Web Flow 两个框架的权威指南,书中包括的技巧和提示可以让你从这个灵活的框架中汲取尽可能多的信息。书中包含了一些开发良好设计和解耦的Web 应用程序的最佳实践...
Spring MVC是Spring框架的一个核心模块,专门用于处理Web请求,它通过模型-视图-控制器(MVC)架构模式分离了业务逻辑、数据处理和用户界面。 首先,我们来详细了解一下Spring MVC。Spring MVC是Spring框架的一部分...
在Spring MVC框架中,AOP(面向切面编程)是一种强大的工具,用于实现跨切面的关注点,如日志管理。本教程将详细介绍如何利用注解来配置和使用AOP来拦截Controller层的方法,以便记录执行过程中的相关信息,实现日志...
**Spring框架** 是Java EE开发中的基石,它提供了一个全面的编程和配置模型,简化了企业级应用的复杂性。Spring的核心特性包括依赖注入(DI)和面向切面编程(AOP),通过这些机制,可以更好地解耦组件,实现松散...
Spring MVC框架详解 Spring MVC是基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web...WebApplicationContext是Spring MVC的核心组件之一,它提供了一个ApplicationContext的实现,用于管理Web应用程序的资源。
好买财富-王晔倞-面对职场变化和转型分岔路,程序员该如何设定目标?