工作近3年,说来惭愧,源生框架用的实在少,刚毕业进了一家比较大的公司,内部的集成封装简直恐怖。
Spring这块一直是在业余学习,这篇博客主要是写一下Spring的流程(配置阶段--初始化阶段--运行阶段),用于记录与分享,希望共同学习,努力进步。
先上两张图:
这是SpringMVC的一个概念图,这个感觉应该都知道,但是我还是贴出来了。
这是我本次实现的简易概念图
主要流程为: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
pom.xml如下图:
有且仅有这个servlet
代码部分:
1.web.xml配置:
2.application.properties
application.properties里面配置仅有,用于扫描包名
scanPackage = main.java.demo
3.DispatcherServlet核心类:
核心类继承至HttpServlet,主要实现doGet doPost 与 init方法。
init的方法 具体如下:
4.相关注解类与业务实现类
在写DispatchServlet的具体实现的时候,我们先定义一些基础的类
4.1注解类:@AutoWired @Controller @RequestMapping @RequestParam @Service
具体的定义如下:
申明具体的生命周期与作用域。其中@AutoWired 适用于字段 @Controller作用于类,@RequestMapping 作用于类于方法,@RequestParam作用于参数, @Service作用于类
4.2业务代码如下:
service
serviceimpl
controller类
5.开始实现DispatcherServlet
5.1加载配置文件:
其中contextConfig 是我定义的一个Properties
private Properties contextConfig = new Properties();
5.2扫描相关类
5.3进行实例化
这边将实例化的类名和类对象放在IOC容器中
我简单的这么定义了IOC容器
private Map<String,Object> ioc = new HashMap<String,Object>();
5.4自动注入
就是拿到我需要AutoWried的字段,然后在IOC中匹配,强行setvalue,做赋值
5.5 handleMapping方法存储
这里我存储的handlers是一个自定义的handle对象,详情见下图
putParamIndexMapping 是一个解析前端的请求地址,并put参数,主要分为两大类。一类是 request response参数,一类是定义了@RequestParam的参数
至此,整个的初始化好了。
6.启动项目,发送请求,doGet-->doPost-->doDispatch;j获取请求,在handleMapping中获取handle,利用正则解析参数,最后利用反射进行调用
由于地址的请求,都是String,但是入参类型不一定是String这边要做一个convert,如下图,写的比较简陋
自此,全部完成。
7.具体效果:
启动服务时:
我把相关的数据输出了
看一下浏览器效果
源码地址如下