spring源码解析

# Spring框架知识体系详解 ## springFramework结构图 ![springArchitectureDiagram1.png](https://cos.easydoc.net/44929674/files/lk17s3t6.png) ## spring的5大版块 1. Web模块:提供对web应用的支持 2. Data Access/Integration 数据访问/集成模块:提供对数据源操作的支持,包括对jdbc、orm映射框架、xml解析、消息队列、事务管理的支持。 3. AOP模块:提供对面向切面编程(AOP)的支持 4. Core Container 核心容器模块:实现spring容器,主要提供IoC/DI功能 5. Test 测试模块:提供对测试的支持 ## spring源码结构 ![springSourceStruct.png](https://cos.easydoc.net/44929674/files/lk17t9lz.png) ## spring启动大致流程 以ClassPathXmlApplicationContext创建容器为例,大体的流程如下: ![spingStartProcess.png](https://cos.easydoc.net/44929674/files/lk17toy7.png) # Bean的生命周期(spring的启动流程) spring的启动入口有很多,在xml中有xml的方式,在注解中有注解的方式,现在在web的方式中也有web的注解启动方式,AnnotationConfigApplicationContext是以注解的配置类的方式启动,就是传入一个配置类,这个配置类包含了你需要注册的到容器中的bean的一些信息,比如扫描类路径信息,但是这个启动入口类是不支持容器的重复刷新的,也就是refresh只能调用一次,而使用AnnotationWebConfigApplicationContext这个是支持容器的重复刷新的. ```java //xml的方式 ApplicationContext context = new ClassPathXmlApplicationContext("aspects.xml", "daos.xml", "services.xml"); //注解的方式 传入MyConfig配置类 ApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class); ``` ## 加载并解析xml Spring将配置好的Bean的信息先封装为BeanDefinition BeanDefinition中封装了Bean的配置信息,包含类名、别名、作用域等Bean的属性。Spring将从配置文件中读取到的信息封装为BeanDefinition,将这些封装后的内容存放入BeanDefinitionMap集合中。这样在后续就可以通过遍历该集合,获取到各个Bean的信息,从而进行实例化、配置装配等操作。 Spring加载配置文件是在refresh#obtainFreshBeanFactory方法中进行的。 以下是spring加载xml的源码: ![1.png](https://cos.easydoc.net/44929674/files/lk3uvtxy.png) ![3.png](https://cos.easydoc.net/44929674/files/lk3v0hye.png)![2.png](https://cos.easydoc.net/44929674/files/lk3v0i61.png)![5.png](https://cos.easydoc.net/44929674/files/lk3v0htc.png)![7.png](https://cos.easydoc.net/44929674/files/lk3v0i8g.png)![6.png](https://cos.easydoc.net/44929674/files/lk3v0i3u.png) ![1.png](https://cos.easydoc.net/44929674/files/lk42bvkx.png)![2.png](https://cos.easydoc.net/44929674/files/lk42bw2x.png)![4.png](https://cos.easydoc.net/44929674/files/lk42bvng.png)![3.png](https://cos.easydoc.net/44929674/files/lk42bvxv.png) ![1.png](https://cos.easydoc.net/44929674/files/lk43mjls.png)![2.png](https://cos.easydoc.net/44929674/files/lk43mjqq.png)![4.png](https://cos.easydoc.net/44929674/files/lk43mj72.png)![3.png](https://cos.easydoc.net/44929674/files/lk43mjm8.png)![5.png](https://cos.easydoc.net/44929674/files/lk43mjqb.png) ![1.png](https://cos.easydoc.net/44929674/files/lk43pt7m.png)![2.png](https://cos.easydoc.net/44929674/files/lk43ptak.png)![3.png](https://cos.easydoc.net/44929674/files/lk43pt1f.png)![4.png](https://cos.easydoc.net/44929674/files/lk43ptcq.png)![5.png](https://cos.easydoc.net/44929674/files/lk43pt9o.png)![6.png](https://cos.easydoc.net/44929674/files/lk43pt8s.png)![7.png](https://cos.easydoc.net/44929674/files/lk43ptjo.png)![8.png](https://cos.easydoc.net/44929674/files/lk43ptkc.png)![9.png](https://cos.easydoc.net/44929674/files/lk43ptqq.png) ## bean实例化过程