工作近3年,说来惭愧,源生框架用的实在少,刚毕业进了一家比较大的公司,内部的集成封装简直恐怖。

Spring这块一直是在业余学习,这篇博客主要是写一下Spring的流程(配置阶段--初始化阶段--运行阶段),用于记录与分享,希望共同学习,努力进步。

先上两张图:

这是SpringMVC的一个概念图,这个感觉应该都知道,但是我还是贴出来了。
Spring 原理初探,简易实现

这是我本次实现的简易概念图
Spring 原理初探,简易实现

主要流程为:Tomcat容服务启动时,在web.xml中增加DispatchServlet。DispatchServlet在容器初始化的时候,通过web.xml里面配置的路径,去加载application.properties。在获取到application.properties之后,我通过在application里面配置的scanPackage,去进行扫描相关类, 然后将类名与类的实例化,放入IOC容器中,做到一个初始化的过程。再接着,我把定义了@AutoWried的字段,进行setValue,实现自动注入。最后,扫描带有@controller注解的类,将URL与Method方法放入一个HandleMapping中。至此,初始化容器就结束了。接着是客户端发起请求,进行拦截,获取相关的URL在HandlerMapping中匹配,在利用反射调用,最后页面输出。

额,我这边写的时候,没有那写Model层,我只是简单的进行了输出页面值。

 

先看一下工程缩量图,和pom.xml

Spring 原理初探,简易实现

pom.xml如下图:

Spring 原理初探,简易实现

有且仅有这个servlet

代码部分:

1.web.xml配置:
Spring 原理初探,简易实现

2.application.properties

application.properties里面配置仅有,用于扫描包名

scanPackage = main.java.demo

3.DispatcherServlet核心类:

Spring 原理初探,简易实现

 

核心类继承至HttpServlet,主要实现doGet doPost 与 init方法。

init的方法 具体如下:
Spring 原理初探,简易实现

4.相关注解类与业务实现类

在写DispatchServlet的具体实现的时候,我们先定义一些基础的类

4.1注解类:@AutoWired @Controller @RequestMapping @RequestParam @Service

具体的定义如下:

Spring 原理初探,简易实现

申明具体的生命周期与作用域。其中@AutoWired 适用于字段 @Controller作用于类,@RequestMapping 作用于类于方法,@RequestParam作用于参数, @Service作用于类

 

4.2业务代码如下:

service

 

Spring 原理初探,简易实现

serviceimpl

Spring 原理初探,简易实现

controller类

Spring 原理初探,简易实现

5.开始实现DispatcherServlet

     5.1加载配置文件:

Spring 原理初探,简易实现

其中contextConfig 是我定义的一个Properties

private Properties contextConfig = new Properties();

5.2扫描相关类

Spring 原理初探,简易实现

 5.3进行实例化

Spring 原理初探,简易实现

这边将实例化的类名和类对象放在IOC容器中

我简单的这么定义了IOC容器

private Map<String,Object> ioc = new HashMap<String,Object>();

5.4自动注入

Spring 原理初探,简易实现

就是拿到我需要AutoWried的字段,然后在IOC中匹配,强行setvalue,做赋值

5.5  handleMapping方法存储

Spring 原理初探,简易实现

这里我存储的handlers是一个自定义的handle对象,详情见下图

Spring 原理初探,简易实现

putParamIndexMapping 是一个解析前端的请求地址,并put参数,主要分为两大类。一类是 request response参数,一类是定义了@RequestParam的参数

Spring 原理初探,简易实现

至此,整个的初始化好了。

6.启动项目,发送请求,doGet-->doPost-->doDispatch;j获取请求,在handleMapping中获取handle,利用正则解析参数,最后利用反射进行调用

Spring 原理初探,简易实现

 由于地址的请求,都是String,但是入参类型不一定是String这边要做一个convert,如下图,写的比较简陋

Spring 原理初探,简易实现

自此,全部完成。

7.具体效果:
启动服务时:

我把相关的数据输出了

Spring 原理初探,简易实现 看一下浏览器效果

Spring 原理初探,简易实现

Spring 原理初探,简易实现

源码地址如下 

https://download.csdn.net/download/tt_4419/10973133

相关文章: