代码整体结构如图
基本思路流程:
一、new ApplicationContext() 读取配置文件 获取全类名list
BeanDefinitionReader工具类:
1.读取xml中配置的文件 Properties读取成键值对形式 获取scanPackage
2.向下递归扫描出.class结尾的文件放入全类名list
二、扫描子类及其实现的接口(接口的值用子类值存储),封装得到BeanDefinitionList集合
1.doLoadBeanDefinitions()遍历全类名list 将beanName和beanClassName封装成BeanDefinition对象并放入BeanDefinitionList集合中
三、存入BeanDefinitionMap集合
1.遍历BeanDefinitionList集合,将对象id名和BeanDefinition对象存入map集合
四、实例化对象放入ioc 并初始化属性值
1.遍历map,循环调用getBean(),通过反射获取对象并做个二级缓存在Map,将对象封装成BeanWrapper(bean,class)
2.再将BeanWrapper缓存到ioc集合中
3.DI操作,判断是不是加了@YService或@YController注解,加了就获取属性,遍历属性,加了@YAutowired注解就给属性赋值
五、初始化handleMapping,将url和menthod一一对应
1.定义一个handleMapping的map集合
2.调用ApplicationContext中的getBeanDefinitionNames()方法获取对象名,根据对象的class对象判断是否有@YController注解
3.判断是否有@YRequestMapping注解,有url值的话则获取baseUrl
4.反射获取对象中所有方法,判断方法上是否有@YRequestMapping注解,获取其url值,和baseUrl一起拼接成一个uri,将其和method一起放入handleMapping集合
------------------至此init初始化阶段完成,进入service方法----------
1.获取请求的url和项目名称,得到uri
2.判断handle集合中是否有这个uri,没有就404,有则取出其method
3.根据method获得对象名,获取请求的参数执行invoke方法
完整代码发布在github:https://github.com/yangzhenyan/spring_ioc.git