SpringMVC实现原理
一、初始化工作
1.根据Spring IOC 的思路,需要将参与业务的对象全部创建并保存,共流程调用。所以首先我们需要创建Controller对象,Http请求是通过注解找到对应的Controller对象,所以我们需要将所有的Controller与其注解建立关联。
2.Controller 的Method 也是通过注解与HTTP请求映射的,同样的,我们需要将所有的Method与其注解建立关联,HTTP直接通过注解的值找到对应的Method.
3.实例化视图解析器
1.DispatcherServlet接受请求,通过映射从IOC容器中获取对应的Controller对象
2.根据映射获取Controller对象对应的Method
3.调用Method,获取返回值
4.将返回值传给视图解析器,返回物理视图
5.完成页面的跳转
二、创建MyDispatcherServlet
1).init方法完成初始化:
1.将Controller与注解进行关联,保存到IOC Container中,同时满足两点:一点:springMVC.xml中配置扫描的类;二点:类定义处添加注解
Controller对象代码思路:
(1)解析springMVC.xml
(2)获取component-scan标签配置的包下的所有类
(3)判断若这些类添加了@MyController 注解,则创建实例对象,并保存到iocContainer中
(4)@MyRequestMapping的值为键,Controller对象为值
将Controller中的Method与注解进行关联,保存到handlerMapping中,代码思路:
(1)遍历iocContainer中的Controller实例对象
(2)遍历每一个Controller对象的Method
(3)判断Method是否添加了@MyRequestMapping注解,若添加,则进行映射并保存
(4)保存到handlerMapping中,@MyRequestMapping的值为键,Method为值
实例化ViewResolver,代码思路:
(1)解析springMVC.xml
(2)根据bean标签的class属性获取需要实例化的MyViewResolver
(3)使用反射创建实例化对象,同时获取prefix和suffix属性,以及setter方法
(4)使用反射调用setter方法给属性赋值,完成MyViewResolver的实例化。
doPost方法处理HTTP请求:
(1)解析HTTP,分别得到Controller和Method对应的uri
(2)通过uri分别在iocContainer和handlerMapping中获取对应的Controller以及Method
(3)使用反射调用Method,执行业务方法,获取结果
(4)结果传给MyViewResolver进行解析,返回真正的物理视图
(5)页面跳转