1. SpringMVC流程介绍
①HandlerMapping:负责映射request和Handler,返回HandlerExecutionChain执行链,包含了拦截器和处理请求的Handler。
②HandlerAdapter:通过执行链,调用对应的HandlerAdapter去执行Handler,返回ModelAndView。
③View:解析成一个view视图,返回给DispatcherServlet
2. 自定义注解
2.1 注解的好处
注解能保存类需要的一些信息,并存活于源代码、编译器、运行期,比如在Hibernate中,想实现ORM就得指定实体类和数据表之间的关系,而这层关系可以用xml来表示,当用xml来维护这层关系时,就是将实体类所需要的信息存储在xml中,此时也可以通过注解来实现,将信息维护在实体类中,这样一个类就能不依赖外部文件来使用了。
2.2 元注解
@Target:指定注解作用的范围,如作用于类,方法,属性
@Documented:成为公共API
@Retention:存活的生命期,如源代码、编译器、运行期
@Inherited:注解继承
2.3 使用注解
自定义四个注解,分别是
@Controller:指定Controller类
@Service:加入IoC容器中
@Autowired:从IoC容器中获取对象
@RequestMapping:请求对应的处理方法
3. 实现流程
实现SpringMVC功能的主要函数是DispatcherServlet,实现流程如下
3.1 扫描当前项目下的所有文件
流程:将项目中的文件遍历出来,包括包和类文件,并将文件路径加入pathNames中,如 zhku.mvc.controller.MsgController转换成zhku/mvc/controller/MsgController
目的:文件路径是反射时需要
3.2 通过反射实例化对象
操作:实例化Controller类和Service类,并加入instanceMap中
目的:封装映射关系时和为@Service注入对象需要
3.3 封装request和method的映射关系
操作:取出instanceMap中的Controller对象,并获取其内的RequestMapping注解的值value,这就是匹配的request,将这个value和method对象加入handlerMap中
目的:request请求匹配相关操作方法时需要
3.4 IoC:为使用@Service注解的属性注入对象
操作:遍历instanceMap,找到所有Field,注解为@Autowired的Field则获取其注解value,通过value到instanceMap中获取对象,并注入到这个Field中,实现注入对象功能。
目的:注入对象
3.5 doPost():处理请求,匹配对应的method
操作:获取实际请求路径,并从handlerMap中匹配对应的method对象,获取method之后通过反射调用方法即可。
目的:处理请求