Spring 二、400行代码手写初体验Spring V1.0版本

 周末无事,借鉴Tom老师思路,手撕一个简版的Spring,大致思路如图。

 首先按照spring的设计,把前提条件如对应注解、controller、service提前建好。

一、配置阶段、准备前置条件

  1. 新建web项目,自己创建常用Spring注解如 @Controller、@RequestMapping、@RequestParams、@Service
  2. 创建Service、Controller,使用自己的Spring注解 
  3. 配置文件简单指定需要扫描的包,并在web.xml里加以配置

二、实现spring IOC、DI、Url Mapping、Dispatcher逻辑

IOC容器实现

 遍历扫描路径component-scan,获取class

 1、程序初始化,加载DispatcherServlet.init(config)方法,从中获取扫描路径scanPath,扫描路径下所有的.class文件;
 2、判断.class文件是否有使用Spring注解@Controller、@Service等,如果有则为需要交为IOC容器管理的类;
 3、获取BeanNmae与Class之间关系, BeanName的三种情况:注解的赋值,类名首字母小节、上层接口与Class之间关系
 4、反射创建Class的实例对象,记录对象与BeanName的关系   

DI依赖注入实现

 遍历IOC容器,反射获取属性,从IOC容器找出对应属性值反射为属性赋值

  1. 遍历IOC容器,获取实例的Class,反射获取所有属性值
  2. 依次判断属性值是否存在@Autowired注解,存在则为需要进行依赖注入的属性
  3. 根据注解的赋值或者Field类型从IOC容器中取对应实例,反射为属性赋值

MVC实现

 缓存Controller中注解定义的url及method、method入参出参关系,在发出请求后根据请求url匹配到method,反射执行该方法并返回结果至response

  1. 遍历IOC容器,获取有@Controller注解的对象,反射获取所有method
  2. 根据method上的RequestMapping注解获取url与method的对应关系
  3. 反射获取method的所有请求参数及参数上是否有@RequestParam注解,记录需要赋值的入参
  4. 页面发出请求,DispatcherServlet.doDispatcher()分发url,正则匹配上对应请求的Controller下的method
  5. 从请求的request种获取传入的参数,反射调用method.invoke()执行方法,返回结果只response

具体实现代码,整个小项目可在此处查看 码云

原文地址:https://www.cnblogs.com/Qkxh320/p/spring_02.html