Spring Framework源码地址:https://github.com/spring-projects/spring-framework
从目录结构可以看出整个Spring框架都遵从模块化设计的思路,总共分为20多个模块,如下图所示:
从上图可以看出:
Spring主要分为五个部分:
1、测试模块:主要实现了Spring的Junit等测试框架。
2、Spring核心容器:里面都是Spring框架实现的基础,主要包括了spring-beans、spring-core、spring-context等三个核心基础模块。
3、Spring Data模块:主要实现了包括Spring支持各种ORM框架,如JDBC Template、JPA、mybatis等的集成;还包括了Spring集成Marshalling XML的处理模块;以及对Spring包括声明式与编程式事务的支持。
4、Spring核心功能扩展模块:主要在Spring核心模块的基础上,实现了包括AOP、对象绑定、i18n、类型转换、事件、消息等框架机制的支持。
5、Spring Web模块:主要实现了Spring对Web的支持,如SpringMvc、Webservice等的支持。
从上面的分析可以看出,Spring容器的所有实现都基于Spring核心模块的实现,所以下文我主要基于Spring核心模块的核心代码实现做分析:
- spring-beans模块:
spring-beans模块提供 BeanFactory,工厂模式的微妙实现,它移除了编码式单例的需要,并且可以把配置和依赖从实际编码逻辑中解耦。
下图是BeanFactory的层次结构如下:
从上图可以看出:BeanFactory为顶层的工厂接口,定义了获取单个Bean实例特征的方法,其下有Spring对于Jndi类型的Bean工厂的直接实现;AutowireCapableBeanFactory 定义了自动装载Bean一系列接口,为Spring容器实现自动装载功能提供支持;HierarchicalBeanFactory为BeanFactory提供层级关系,一个应用中可以存在多个BeanFactory,该类即为多个BeanFactory提供了层级关系,定义了获取父BeanFactory与当前层次BeanFactory是否包含某个Bean实例的方法;ListableBeanFactory定义了获取Spring容器中所有某类(全部)Bean实例的方法。
AutowireCapableBeanFactory层次结构图如下:
AbstractAutowireCapableBeanFactory提供了可自动装配的Bean Factory的默认实现;DefaultListableBeanFactory为可自动装载的ConfigurableListableBeanFactory实现,该BeanFactory既满足可列出所有Bean的同时,又可以实现自动装配;XmlBeanFactory为Spring容器提供的从xml文件中读取BeanDefinition为DefaultListableBeanFactory的一种实现,目前在Spring Framework的最新版本中已不推荐使用。其中HierarchicalBeanFactory和ListableBeanFactory的实现关系与AutowireCapableBeanFactory相类似,最终,DefaultListableBeanFactory同时实现了三种类型的BeanFactory的接口。所以,下文主要以DefaultListableBeanFactory为例做Spring BeanFactory的实现分析:
从上图可以看出:DefaultListableBeanFactory中以线程安全ConcurrentHashMap容器存储了Spring容器中所有Bean的定义与beanName的键值对与缓存了单例的Bean实例,以此来实现满足三种条件的BeanFactory;Spring获取Bean实例时首先会从缓存中去取bean实例,如果取不到,则创建实例,下面主要分析BeanFactory创建Bean实例的方法:
protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args)
throws BeanCreationException {
// Instantiate the bean.
BeanWrapper instanceWrapper = null;
if (mbd.isSingleton()) {
instanceWrapper = this.factoryBeanInstanceCache.