# spring-framework **Repository Path**: Kongong/spring-framework ## Basic Information - **Project Name**: spring-framework - **Description**: 本项目旨在深入学习Spring源码。从简单到复杂,慢慢扩充到30个类,实现mini版本的Spring框架 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-11-16 - **Last Updated**: 2021-06-03 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # spring-framework #### 介绍 本项目旨在更加深入的了解、学习是spring框架,从最初的1.0版本,慢慢升级到由30个类完成的Spring 2.0版本,以达到透彻理解Spring的目的,感受作者的意图 ##### 一切从web.xml开始 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1118/153510_6b18ab91_1675131.jpeg "2-1.jpg") web.xml中定义了启动所需的一些配置文件,以及核心类MyDispatchServlet. 1.0版本对应的是MyDispatcherServletBak #### 2.0版本 根据软件设计原则、结合设计模式,对1.0版本进行拆分和增强 ##### ApplicationContext Spring核心模块IOC与DI,属于spring-beans和spring-core包,spring-context是建立在核心包之上的模块。扩展了BeanFactory, 为它添加了Bean生命周期、框架事件体系。ApplicationContext是其核心接口,超类是BeanFactory。getBean()是其重要方法。 * ApplicationContext:简单理解为工厂类,与BeanFactory的最大差异在于ApplicationContext一开始变初始化非Lazy、单例 * BeanDefinitionReader:读取配置文件,并将配置文件中对应的类封装成BeanDefinition * BeanDefinition:类配置信息 * BeanWrapper:根据BeanDefinition信息,反射生成Instance,封装成BeanWrapper ![输入图片说明](https://images.gitee.com/uploads/images/2020/1116/222941_5870ab94_1675131.jpeg "3-1.jpg") ##### MVC模块 Spring Web MVC模块,在Servlet init()方法中初始化九大组件,分别是: * MultipartResolver:多文件上传组件 * LocaleResolver:本地语言环境组件 * ThemeResolver:主体模板处理器组件 * HandlerMapping:保存URL映射关系 * HandlerAdapter:动态参数适配器 * HandlerExceptionResolver:异常拦截器组件 * RequestToViewNameResolverTranslator:视图提取器 * ViewResolver:视图转换器 * FlushMapManager:参数缓存器,转发、重定向传值 在2.0版本中,仅实现其中的3个组件:HandlerMapping、HandlerAdapter、ViewResolver: * 初始化HandlerMapping,将Controller中方法请求路径URL、Method、Controller封装成HandlerMapping,并进行缓存 * 初始化HandlerAdapter,仅简单的将HandlerMapping与HandlerAdapter进行一一映射 * 初始化ViewResolver MVC的整体思想流程如下: * 根据用户请求url获取对应的HandlerMapping * 根据HandlerMapping获取对应的动态参数转化器HandlerAdapter * 通过HandlerAdapter中的handler()方法,通过反射技术,进行方法调用,并返回ModelAndView * 通过ViewResolver对返回值ModelAndView中的viewName进行处理,封装成View对象 * 通过view中的render()方法,读取页面文件(html),并采用正则匹配方式,对参数进行替换,最终输出到浏览器 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1118/102842_975a910f_1675131.jpeg "3-2.jpg") ##### AOP模块 AOP即Aspect Oriented Programming,面向切面编程,底层采用动态代理技术实现。实现对目标类、方法的解耦与增强。 具有共同特征的类或者方法,都可以称之为一个侧,即切面。 在Spring中,切面织入称为通知,即Advice,一个方法可以对应若干个通知。 AOP发生在IoC之后,DI之前,根据切面表达式pointCut判断是否满足条件,生成代理对象,然后再进行DI AOP的设计思想总体如下: * 在IoC模块中,配置信息的读取与处理是通过工具类BeanDefinitionReader进行的。同理,AOP模块的配置信息读取、织入方法的处理等是由工具类AdviceSupport进行的 * AOP发生在IoC之后、DI之前,而bean的实例化是在ApplicationContext的getBean()方法,故在getBean()方法内部的instantiateBean()方法中进行AdviceSupport的实例化 * 根据切面表达式进行匹配,对满足条件的类中方法,将method与对应的advice进行封装,一个method可以对应多个advice.advice即切面类中的方法,例如before、after、afterThrowing等 * 满足条件的类,生成代理对象,并放入IoC容器,后续完成DI * 在进行方法调用时,执行代理类的invoke方法时,进行方法织入,反射进行调用 ![输入图片说明](https://images.gitee.com/uploads/images/2020/1118/153519_2f6fe0f5_1675131.jpeg "3-3.jpg")