- 一:使用BeanFactory加载XML
BeanFactory bf = new XmlBeanFactory(new ClassPathResource("beanFactory.xml"));
MyTestBean bean = bf.getBean("myTestBean");
ClassPathResource分析
这个类,主要是实现了 InputStreamSource 接口,获取资源的,并实现了对资源的一些操作方法
另外,通常有的资源数据是属于没有加工过的,这个时候 我们会定义个类,把资源数据塞到这个类里面,这个类在定义一些方法来处理这个资源。可以把这个类叫做包装类吧。
XmlBeanDefinitionReader
该类是XmlBeanFactory类的一个成员属性。XmlBeanFactory类的继承结构特点是 继承类、实现接口比较多。可以说XmlBeanFactory继承的DefaultListableBeanFactory完成的是加载bean,而其成员属性XmlBeanDefinitionReader完成的是bean的xml解析。这里用到的设计方法是 类继承 和 类组合。is a 和 has a
AbstractBeanDefinitionReader
该类有5个私有成员变量,其中一个是构造器传入,有一个是设置了初始值,使用new,其他3个在构造器中也会用new的方式设置默认值,也提供了 set方法来赋值。这种也是使用 has a 的设计方法,用 其他类作为自己的成员变量以扩充自己的功能。
因此,想要全面了解 AbstractBeanDefinitionReader的功能,就需要把他的成员变量都研究一遍才行。这种需要花费一定的时间
1. 看下ResourceLoader
是用的是在构造器中 new一个默认的实现类。PathMatchingResourePatternResolver ,该类也有自己的 几个成员变量,以扩展自己的功能。(额,实在是太多了,想要好好分析分析的话,真的需要花费不少时间,但是 这里主要是注意这里的设计,就是 爆露一个 外部类 给别人使用,而类的内部 使用了 继承 ,继承了很多功能,在组合一个类,而这类又有自己的继承结构组合接口)
- 二:使用ApplicationContext加载XML
ApplicationContext bf = new ClassPathXmlApplicationContext("beanFactory.xml");
MyTestBean bean = bf.getBean("myTestBean");
分析ClassPathXmlApplicationContext:
ClassPathXmlApplicationContext类的继承结构比较多,先分析DefaultResourceLoader
--------------------------DefaultResourceLoader
DefaultResourceLoader 实现了 ResourceLoader接口。
分析ResourceLoader
ResourceLoader 接口:
1个常量,表示资源路径前缀。
2个方法,一个用来 通过资源路径返回Resource,一个用来获取ClassLoader。ClassLoader不用多说了,是JDK里的类加载器。Resource 接口提供了一些对资源进行操作的方法,并继承了InputStreamSource,该接口提供了获取InputStream的方法,InputStream也不用多说了,是JDK里的IO相关的类。
通过对ResourceLoader接口的分析发现,其中涉及到了3个接口:其中用到了 接口继承 和 接口组合的设计方式。
真正获取资源的是 InputStreamSource接口,该接口返回InputStream。
Resource接口继承InputStreamSource并提供了对资源的一些基本操作方法。
ResourceLoader来作为一个对外开放的接口,用来提供获取Resource的方法。
分析DefaultResourceLoader:
DefaultResourceLoader 是对接口 ResourceLoader的默认实现。
其中实现了 ResourceLoder的两个抽象方法,并增加了一些自己的方法。并且有一个内部类ClassPathContextResource。
是的,上面分析ResourceLoader时,提到了3个接口,其中DefalutResourceLoader实现了ResourceLoader接口,那Resource接口和InputStreamSource接口谁来实现,那么 ClassPathContextResource 正是干这个事情的。
分析ClassPathContextResource:
额,其实不用分析了,我们已经知道 那2个接口时干什么的了,这个类就是用来实现的,先不管是怎么实现的吧。
- 三、BeanFactory、FactoryBean、ObjectFactory
看spring源码的时候,接口多,类多,有的接口被很多接口继承。源码看久了,就会知道,其中的含义。
为什么会有这么多接口?
java面向对象编程里,类,就是由方法和属性构成的,通常会把共同的方法提取出来放在一个接口中。代码设计最重要的,就是设计出合适的接口,类;最核心的方法,放在接口最底层,然后由类的结构继承关系,最后所有的方法都会继承在最上层的类中,这个类包含了继承结构中所有的功能。
就像最低层的BeanFactory 和 最上层的 DefaultListableBeanFactory。
怎么分析这种有复杂继承关系的类图呢?
有两种方法:
第一种,我们可以从最上层的类来开始分析,我们知道,一个类最多继承一个类,可以继承多个接口。那这样分析的话比较麻烦。
第二种是从最底层的接口开始分析,这种方式比较可取吧。
- 四、体会
有人说,程序=算法+数据结构。
那就按照这个公式来解释下:
1. 算法:什么是算法?可以解释为,完成某项功能的指令集合。说直白点,就是我们写的程序。
2.数据结构:什么又是数据结构呢?按照字面意思,就是 描述数据的 ,存储数据的 一种容器,容器的类型结构又不同。常用的数据结构比如 栈 队列 链表 树 等等,这些 不同的 容器结构 来存储数据时,数据会呈现出 具有这种容器结构的特性出来,以便程序能够更好的 处理这些数据。
了解了程序 是 算法处理某种数据结构的指令集合,那边现在有一个问题: 数据从哪里来?数据又是什么?
根据工作几年的经验来看,一般金融类软件处理的数据,一般 为客户信息,商品信息,订单信息等。所有的这些数据 正是 通常开发的程序所要处理的数据了。
上面谈到了 算法、数据结构、及数据,现在来看看springframework 处理的数据又是什么?
springframework 有一个重要的配置文件,叫application.xml。是的,数据来自于配置文件,也就是我们需要创建的bean。我们要创建的这些bean 就是 springframework所要处理的数据。创建在于收集信息,就像是 一个用户开户一样,需要收集客户的各种信息,等到收集完成之后,就是一个insert而言。难点就在于 如何收集这些数据、如何正确的收集?
springframework的第二种扩展功能比第一种扩展的就是,在读取xml配置文件数据 前后增加了对数据加工的功能,有了这些加工的功能,就可以扩展功能来处理数据了。比如 前置处理器、后置处理器、AOP等。
好了,我想,有了这些背景知识,会对学习springframework有一定的帮助。
另外,在延伸一下,计算机中存储的一切都是数据,万千复杂,有一些工具用来处理数据,而另一些工具是以某些工具作为数据。
- 五、解决循环依赖时,用到的几个缓存

- 六、钩子
spring在创建实例时,会按照如下顺序调用 postprocessor方法
======
createBean:
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation
BeanPostProcessor#postProcessAfterInitialization
====
doCreateBean:
MergedBeanDefinitionPostProcessor
SmartInstantiationAwareBeanPostProcessor.getEarlyBeanReference
=========
populateBean:
InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
InstantiationAwareBeanPostProcessor.postProcessPropertyValues
==========
initializeBean:
BeanNameAware
BeanClassLoaderAware
BeanFactoryAware --> AbstractAutowireCapableBeanFactory
BeanPostProcessor.postProcessBeforeInitialization
InitializingBean.afterPropertiesSet
BeanPostProcessor.postProcessAfterInitialization
==========
//ApplicationContext扩展的功能
QualifierAnnotationAutowireCandidateResolver
ApplicationContextAwareProcessor
BeanFactoryPostProcessor
BeanPostProcessor