前言java
在分析spring源码以前,推荐Spring做者 Rod Johnson的两本书:spring
这两本书是spring 做者多年的J2EE工做中总结的思想和经验,spring框架就是在这些思想上开发出来的;认真读后,多看spring源码,领悟其设计思想,提升设计能力。编程
到目前为止,spring framework已经到了第四个版本,里面已经扩展了大量的模块和功能,在分析源码的时候须要分清主次,理清主要结构体系;spring是彻底遵循面向接口的编程,而且模块清晰,每个有模块都是有高度抽象的接口到底层更具业务变化的实现,因此我在这里分析源码是采用的方法就针对不一样的模块进行分析,在了解各个模块的功能后,进行总体分析;设计模式
IOC基础结构缓存
org.springframework.beans和org.springframework.context是spring framework ioc的基本组成,BeanFactory是整个IOC容器的最基本接口;下图是IOC容器元老级的几个接口app
在这里须要弄清楚这几个接口各自都有什么样的功能,须要逐个分析框架
1.BeanFactoryide
spring容器的最基本接口,是client view的Bean container;从方法清单中能够理解该接口的大体功能spa
2.HierarchicalBeanFactory设计
定义了BeanFactory的父子链结构
3.ListableBeanFactory
该接口的功能是用来列出全部Bean的名称、类型、注解等信息
4.AutowireCapableBeanFactory
该接口的功能是主要实现了Bean的自动装配功能,为实例Bean暴露了装配的功能,注意:ApplicationContext并无实现该接口,该接口在Spring容器外也可使用,在容器中能够经过ApplicationContext.getAutowireCapableBeanFactory()获取;
下面继续向下展开一层,接口的结构图以下
首先,这里有一个独立的接口SingletonBeanRegistry,该接口是要定义了一个单例Bean的注册,目的是方便统一管理单例Bean;
1.ConfigurableBeanFactory
配置接口,被绝大部分BeanFactory实现,该接口功能:提供了对bean factory的配置设施;该接口方法不少,这里列出几个定义须要配置的属性
void setParentBeanFactory(BeanFactory parentBeanFactory) throws IllegalStateException; void setBeanClassLoader(ClassLoader beanClassLoader); void setCacheBeanMetadata(boolean cacheBeanMetadata); void setBeanExpressionResolver(BeanExpressionResolver resolver); void setConversionService(ConversionService conversionService); void addPropertyEditorRegistrar(PropertyEditorRegistrar registrar); void setTypeConverter(TypeConverter typeConverter); void addBeanPostProcessor(BeanPostProcessor beanPostProcessor); AccessControlContext getAccessControlContext(); void destroyBean(String beanName, Object beanInstance); void destroySingletons();
public interface ConfigurableListableBeanFactory extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {
3.ApplicationContext
ApplicationContext除了具有了HierarchicalBeanFactory和ListableBeanFactory的功能,它还实现了其余四个接口
public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory, MessageSource, ApplicationEventPublisher, ResourcePatternResolver {结构图以下
在查看applicationContext功能以前,须要弄清楚右边这四个接口的功能是什么
(1)ResourceLoader
加载资源的策略接口(如加载classpath下的配置文件,或者文件系统中的资源)
(2)ResourcePatternResolver
加载资源的策略接口(如Ant-style path pattern),对ResouceLoader的扩展;
(3)MessageSource
解析消息的策略接口,支持消息的参数化和国际化;
(4)EnvironmentCapable
该接口表示具有了持有环境变量的能力,全部的ApplicationContext都具有持有环境便量的能力;
(5)ApplicationEventPublisher
该接口表示封装了事件发布的功能;
到目前为止,能够看到ApplicationContext又增长了资源加载、消息解析、环境变量引用、事件发布的功能;如今回头看看ApplicationContext自身都实现了什么功能
从方法列表中能够看出其自身仅仅增长了对自身属性支持;
接下来接续向下展开一层,结构图以下:
1.ConfigurableApplicationContext
从名称上能够知道该接口是对ApplicationContext增长了配置的能力,该接口还集成了Lifecycle接口,先看看Lifecycle具有什么功能
2.Lifecycle
该接口主要定义了对生命周期的控制,能够被定义在容器中的Bean和spring容器使用,容器会将stop/start信号进行冒泡处理,从而能应用到每个组件上,同时能够被JMX调用;
如今回头查看ConfigurableApplicationContext
public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {
到此为止,Spring容器的核心接口基本上分析完了,大体了解了这些核心接口的功能,以及随着接口的扩展,功能愈来愈强大,能够看到面向接口编程的威力。
接下来主要对ConfigurableApplicationContext下面的接口进行分析,最终要揭示spring容器如何启动以及实例化Bean的。
结构图
在这张结构图中,主要关注点是AbstractApplicationContext,能够看到AbstractApplicationContext继承了ResourceLoader的默认实现DefaultResourceLoader,而且实现了接口DisposableBean;
1.DisposableBean
一般是被spring bean实现的接口,主要用来释放资源,例如当销毁一个缓存的单例时,就会调用该方法;当application context 关闭时,会销毁全部的singletons;
2.AbstractApplicationContext 抽象类,在该类中主要使用了模板方法的设计模式,在该类中注册了一下功能 BeanFactoryPostProcessor BeanPostProcessors ApplicationListeners MessageSource LifecycleProcessor 在该抽象类中,完成Spring IOC 容器加载的方法 refresh()很是重要,该方法是spring ioc容器的boot入口 下节中分析refresh()方法是如何完成IOC容器初始化的;