1.简单工厂与高级工厂

   《spring源码深度解析》一书中曾说:“spring的工厂设计分为两条线,一条是以BeanFactory为主线的简单工厂,一条是以ApplicationContext为主线的高级工厂”。 真是听君一席话,少走十年弯路!   让我自己在这么多的源码中钻来钻去,哪怕再过个三五年,怕也不见得能够理解这种宏观的设计思路。

    总之,spirng对工厂的设计的两条线,可以从模块中来大致的分化出来,简单工厂对应的是: spring-beans模块,高级工厂对应的是 spring-context模块。  本着先易后难的思路,先理一理spirngBeans模块的设计。 

2.springBeans模块的组成

spring5源码-spirngBeans模块_spring

  可以看到,简单工厂除了core模块外,对外并无过多的依赖。  简单工厂的设计,作为spring的两大核心之一,它本身的源码量及设计的复杂度,相较于core模块,要高了许多。

3.springBeans模块对简单工厂的设计

spring5源码-spirngBeans模块_spring_02

对于简单工厂的各个层次的接口有如下说明解释:

1.BeanFactory作为顶级接口,它提供从工厂中获取Bean的能力,然则,它只能获得单个Bean对象。 是以 其一个子接口: ListableBeanFactory便由此而来;

2.获取bean时,为了扩展相应的能力,如 自动注入,前置后置处理等,是以便有了子接口: AutowireCapableBeanFactory

3.在设计层面,猜想是借鉴了  类加载器的设计思路,允许 bean工厂存在上下级关系,是以有了: HierarchicalBeanFactory接口

4.这里存在多个顶层抽象接口,并且有相应的子接口进行聚合,在提供API方面,采用的是抽象类的方式,屏蔽了操作的复杂性。

4.springBeans模块对Bean的设计

spring5源码-spirngBeans模块_spring_03

spring5源码-spirngBeans模块_spring_04

spring5源码-spirngBeans模块_设计思路_05

spring5源码-spirngBeans模块_设计思路_06

5.springBeans模块对工厂流程的设计

5.1bean工厂后置处理器

spring5源码-spirngBeans模块_设计思路_07

5.2bean后置处理器

spring5源码-spirngBeans模块_设计思路_08

5.3bean生成的相关流程

spring5源码-spirngBeans模块_设计思路_09

spring5源码-spirngBeans模块_设计思路_10

spring5源码-spirngBeans模块_简单工厂_11

5.4属性注入相关

spring5源码-spirngBeans模块_设计思路_12

5.5说明

   这块代码量太大了,有很多设计来不及细看,暂时先粗略的看一下,因为自己对整个流程还处于似懂非懂的状态,目前需要快速的整理一下骨架。 所以这里吃相就稍稍难看了一点。 

   在简单工厂时,貌似还不涉及到bean的后置工厂处理器,以及bean的后置处理器的处理。但是它是03年的源码,也就是说在设计之初就已考虑在内。 

6.对springBeans模块简单工厂的理解:

6.1Java宏观程序:

spring5源码-spirngBeans模块_设计思路_13

 

6.2Java微观运行流程:

6.2.1虚拟机的启动流程:

spring5源码-spirngBeans模块_简单工厂_14

 

1.初始化本地核心类

spring5源码-spirngBeans模块_spring_15

 

2.开启gc线程

spring5源码-spirngBeans模块_简单工厂_16

 

3.初始化及监测程序

spring5源码-spirngBeans模块_简单工厂_17

 

6.2.2类加载流程

spring5源码-spirngBeans模块_spring_18

spring5源码-spirngBeans模块_简单工厂_19

 

 

执行new操作时,jvm的执行引擎如下:Jvm层面的执行流程:

spring5源码-spirngBeans模块_简单工厂_20

spring5源码-spirngBeans模块_spring_21

spring5源码-spirngBeans模块_设计思路_22

6.2.3 Spring的简单工厂原理:

spring5源码-spirngBeans模块_简单工厂_23

spring5源码-spirngBeans模块_简单工厂_24

7.资源

   文中所用到的jvm源码,可查看文档:c++实现的jvm

   文中所使用的spring源码,地址:​​spring5源码地址​