引言
这个系列是我阅读Spring源码后的一个总结,会从Spring Framework框架的整体结构进行分析,不会先入为主的讲解IOC或者AOP的原理,如果读者有使用Spring的经验再好不过。鉴于每个人对源码阅读角度的不同,如果文中存在理解有误的地方希望读者能够及时提出,共同进步。文章所分析的源码基于5.0.8版本,但使用老版本理解起来问题也不大,因为在框架整体架构上变化并不多。
如果你使用Spring的时间足够长,相信在最初的开发过程中你一定使用过xml文件来加载各中bean。虽然现在基本都会通过配置文件类或者注解来进行加载,但使用xml也有它的优点,这种方式对代码的侵入性最小,而且配置第三方bean也比较方便。这篇文章通过一个图书馆的例子来讲解xml最原始的加载过程,将加载过程中涉及到的各个模块比做图书馆的各个元素,希望能加深你对Spring框架的理解。
图书馆和Spring有许多相似的地方,将图书馆比做bean工厂,从图书馆借书相当于getBean的过程,将图书馆买的书放入图书馆的过程可以类比注册bean(registerBeanDefinition)的过程,而生产图书的过程又可以类比实例化BeanDefinition的过程,是不是很相似?这里我会使用下面一段比较原始的代码来分步讲解这一过程。
ClassPathResource resource = new ClassPathResource("applicationContext.xml"); DefaultListableBeanFactory factory = new DefaultListableBeanFactory(); XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(factory);  reader.loadBeanDefinitions(resource); Object beanObject = factory.getBean("beanName");ClassPathResource与Resource
ClassPathResource resource = new ClassPathResource("applicationContext.xml");这一行代码比较简单,它通过一个xml文件初始化了一个Resource,相当于对xml文件做了一个包装,方便以后将xml文件转换为BeanDefinition。可以将这一过程想象成现在的图书还是一堆木头,而将这些木头搅拌成木浆只是为了后面更方便的获取制作图书的原料而已。
从源码角度来说ClassPathResource继承自Resource接口,是Spring中对资源的抽象,所有需要使用的资源在Spring中都被抽象为Resource,它提供了一系列操作资源的方法,比如获取资源的名称,资源是否存在等等。Resource接口又继承了InputStreamSource接口,在InputStreamSource中,提供了一个核心方法,这个方法将资源转换成InputStream方便后期操作。
public interface InputStreamSource {     InputStream getInputStream() throws IOException; }  public interface Resource extends InputStreamSource {     boolean exists();      URL getURL() throws IOException;      String getFilename();      ...... }BeanFactory、BeanDefinition与DefaultListableBeanFactory
DefaultListableBeanFactory factory = new DefaultListableBeanFactory();DefaultListableBeanFactory就比较重要了,它是一个Bean工厂,相当于图书馆,所有的书都在DefaultListableBeanFactory中,而借书,买书的过程都需要通过DefaultListableBeanFactory来操作。
DefaultListableBeanFactory首先是BeanFactory接口的一个实现,BeanFactory定义了通过名称和类型获取Bean的一系列方法。
public interface BeanFactory {     Object getBean(String name) throws BeansException;      <T> T getBean(Class<T> requiredType) throws BeansException;      boolean containsBean(String name);      ...... }  public class DefaultListableBeanFactory extends AbstractAutowireCapableBeanFactory         implements ConfigurableListableBeanFactory, BeanDefinitionRegistry, Serializable{}
                    
                