# Spring-Framework **Repository Path**: kubuto/Spring-Framework ## Basic Information - **Project Name**: Spring-Framework - **Description**: Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1149 - **Created**: 2020-09-22 - **Last Updated**: 2022-05-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README #spring 源码学习 ## 编译源码 编译顺序 core->oxm->context->beans->aspects->aop 编译插件位置 tasks->other->compileTestJava beanFactory(顶级容器,规范定义了容器的基础行为) ###IOC源码解析 #### Bean生命周期 ![Bean生命周期](img/Bean生命周期.jpg ) 1. 根据配置情况调用Bean构造方法或工厂方法实例化Bean 2. 利用依赖注入完成Bean中所有属性值的配置注入 3. 如果Bean 实现了 BeanNameAware接口,则Spring调用Bean的setBeanName传入当前bean的id值 4. 如果 Bean 实现了 BeanFactoryAware 接⼝,则 Spring 调⽤ setBeanFactory() ⽅法传⼊当前⼯⼚实例的引⽤。 5. 如果 Bean 实现了 ApplicationContextAware 接⼝,则 Spring 调⽤ setApplicationContext() ⽅法传⼊ 当前 ApplicationContext 实例的引⽤。 6. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调⽤该接⼝的预初始化⽅法 postProcessBeforeInitialzation() 对 Bean 进⾏加⼯操作,此处⾮常重要,Spring 的 AOP 就是利⽤它实现的。 7. 如果 Bean 实现了 InitializingBean 接⼝,则 Spring 将调⽤ afterPropertiesSet() ⽅法。 8. 如果在配置⽂件中通过 init-method 属性指定了初始化⽅法,则调⽤该初始化⽅法。 9. 如果 BeanPostProcessor 和 Bean 关联,则 Spring 将调⽤该接⼝的初始化⽅法 postProcessAfterInitialization()此时,Bean 已经可以被应⽤系统使⽤了。 10. 如果在 中指定了该 Bean 的作⽤范围为 scope="singleton",则将该 Bean 放⼊ Spring IoC 的缓存池中, 将触发 Spring 对该 Bean 的⽣命周期管理;如果在 中指定了该 Bean 的作⽤范围为 scope="prototype",则将该 Bean 交给调⽤者 11. 如果 Bean 实现了 DisposableBean 接⼝,则 Spring 会调⽤ destory() ⽅法将 Spring 中的 Bean 销毁; 如果在配置⽂件中通过 destory-method 属性指定了 Bean 的销毁⽅法,则 Spring 将调⽤该⽅法对 Bean 进⾏销毁。 #### BeanFactory创建时序图 ##### 获取BeanFactory时序图 ![BeanFactory获取时序图](img/BeanFactory获取流程.jpg ) 直接返回DefaultListableBeanFactory ##### DeanDefinition 加载解析及注册时序图 ![BeanDefinition注册子时序图](img/BeanDefinition注册子流程.jpg ) 将配置文件中的Bean解析为BeanDefinition,并放入DefaultListableBeanFactory中的beanDefinitionMap中 #### Bean 创建时序图 ![Bean对象创建时序图](img/Bean对象创建流程.jpg ) #### 对象创建流程图 ![Bean对象创建流程图](img/Bean对象创建完整流程.png ) 1. 从一级缓存中获取对象实例,如果能获取到一级缓存则直接返回,否则再次从二级缓存中获取,如果获取到则直接返回对象,否则从三级缓存中获取,存在则将三级缓存上升为二级缓存并移除三级缓存, 最后返回获取到的三级缓存对象 2. 未从缓存中获取到bean,则进行创建bean流程 3. 首先创建bean的实例,仅仅调用构造方法,不进行属性的注入 4. 属性注入 5. 调用初始化方法 6. 将装配完成的对象加入一级缓存 #### 循环依赖问题 指 A依赖于B进行属性的注入,B又依赖于A进行属性的注入 spring 为了解决这个问题,设置了三级缓存的机制,把创建对象与填充属性分步骤进行,并且在创建对象之后立刻就把当前对象的ObjectFactory对象放入三级缓存,这样在循环依赖时 就能够使用三级缓存对象,解决循环依赖问题。 例如有 dxBean 依赖于itBean,itBean依赖于dxBean 这两个实体bean,他们的执行流程为 1. dxBean开始初始化 2. 初始化之后 dxBean立即加入三级缓存 3. dxBean填充属性 1. 依赖itBean ItBean开始初始化 2. 初始化之后ItBean加入三级缓存 3. itBean填充属性 4. 依赖于dxBean,从三级缓存中获取dxBean 5. 把dxBean从三级缓存加入到二级缓存 6. itBean创建完成 加入一级缓存 4. dxBean 创建完成 加入一级缓存 ``` //dxBean开始初始化 createBeanInstance-dxBean //初始化之后立即加入三级缓存 dxBean-add level-3-Cache //填充属性 populateBeandxBean //依赖itBean ItBean开始初始化 createBeanInstance-itBean //初始化之后ItBean加入三级缓存 itBean-add level-3-Cache //填充ItBean 的属性 populateBeanitBean //从三缓存中获取 dxBean 升级dxBean为二级缓存 add level-2-Cache-dxBean //itBean创建完成 加入一级缓存 add level-1-Cache-itBean // dxBean 创建完成 加入一级缓存 add level-1-Cache-dxBean ``` ### springMvc #### dispatchServlet继承关系 ![Bean对象创建流程图](img/DispatcherServlet.png) HandlerExecutionChain ->HandlerAdapter->RequestMappingHandlerAdapter(invokeHandlerMethod)->ServletInvocableHandlerMethod(invokeAndHandle)