一 spring源码分析--- IOC容器

前言

在分析spring源码之前,推荐Spring作者 Rod Johnson的两本书:

  1. Expert One-on-One J2EE Design and Development
  2. Expert One-on-One J2EE Development without EJB

这两本书是spring 作者多年的J2EE工作中总结的思想和经验,spring框架就是在这些思想上开发出来的;认真读后,多看spring源码,领悟其设计思想,提高设计能力。

到目前为止,spring framework已经到了第四个版本,里面已经扩展了大量的模块和功能,在分析源码的时候需要分清主次,理清主要结构体系;spring是完全遵循面向接口的编程,并且模块清晰,每一个有模块都是有高度抽象的接口到底层更具业务变化的实现,所以我在这里分析源码是采用的方法就针对不同的模块进行分析,在了解各个模块的功能后,进行整体分析;

IOC基础结构

org.springframework.beans和org.springframework.context是spring framework ioc的基本组成,BeanFactory是整个IOC容器的最基本接口;下图是IOC容器元老级的几个接口

《一 spring源码分析--- IOC容器》

在这里需要弄清楚这几个接口各自都有什么样的功能,需要逐个分析

1.BeanFactory

spring容器的最基本接口,是client view的Bean container;从方法清单中可以理解该接口的大致功能

《一 spring源码分析--- IOC容器》

2.HierarchicalBeanFactory

定义了BeanFactory的父子链结构

《一 spring源码分析--- IOC容器》

3.ListableBeanFactory

该接口的功能是用来列出所有Bean的名称、类型、注解等信息  

《一 spring源码分析--- IOC容器》

4.AutowireCapableBeanFactory

该接口的功能是主要实现了Bean的自动装配功能,为实例Bean暴露了装配的功能,注意:ApplicationContext并没有实现该接口,该接口在Spring容器外也可以使用,在容器中可以通过ApplicationContext.getAutowireCapableBeanFactory()获取;

《一 spring源码分析--- IOC容器》

下面继续向下展开一层,接口的结构图如下

《一 spring源码分析--- IOC容器》

首先,这里有一个独立的接口SingletonBeanRegistry,该接口是要定义了一个单例Bean的注册,目的是方便统一管理单例Bean;

《一 spring源码分析--- IOC容器》

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();

2.ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactory
		extends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

该接口继承了BeanFactory下的三大子接口的所有功能,使其具备了可配置、可自动装配、可枚举Bean属性的能力,这些能力都是继承下来的,它自身的功能是提供了分析和修改Bean定义的设施以及预先实例化单例Bean的能力;

《一 spring源码分析--- IOC容器》

3.ApplicationContext

ApplicationContext除了具备了HierarchicalBeanFactory和ListableBeanFactory的功能,它还实现了其他四个接口

public interface ApplicationContext extends EnvironmentCapable, ListableBeanFactory, HierarchicalBeanFactory,
		MessageSource, ApplicationEventPublisher, ResourcePatternResolver {

结构图如下

《一 spring源码分析--- IOC容器》

在查看applicationContext功能之前,需要弄清楚右边这四个接口的功能是什么

(1)ResourceLoader

加载资源的策略接口(如加载classpath下的配置文件,或者文件系统中的资源)

《一 spring源码分析--- IOC容器》

(2)ResourcePatternResolver
加载资源的策略接口(如Ant-style path pattern),对ResouceLoader的扩展;

《一 spring源码分析--- IOC容器》

(3)MessageSource
解析消息的策略接口,支持消息的参数化和国际化;

《一 spring源码分析--- IOC容器》

(4)EnvironmentCapable
该接口表示具备了持有环境变量的能力,所有的ApplicationContext都具备持有环境便量的能力;

《一 spring源码分析--- IOC容器》

(5)ApplicationEventPublisher
该接口表示封装了事件发布的功能;

《一 spring源码分析--- IOC容器》

到目前为止,可以看到ApplicationContext又增加了资源加载、消息解析、环境变量引用、事件发布的功能;现在回头看看ApplicationContext自身都实现了什么功能

《一 spring源码分析--- IOC容器》

从方法列表中可以看出其自身仅仅增加了对自身属性支持;

接下来接续向下展开一层,结构图如下:

《一 spring源码分析--- IOC容器》

1.ConfigurableApplicationContext
从名称上可以知道该接口是对ApplicationContext增加了配置的能力,该接口还集成了Lifecycle接口,先看看Lifecycle具备什么功能
2.Lifecycle
该接口主要定义了对生命周期的控制,可以被定义在容器中的Bean和spring容器使用,容器会将stop/start信号进行冒泡处理,从而能应用到每一个组件上,同时可以被JMX调用;

《一 spring源码分析--- IOC容器》

现在回头查看ConfigurableApplicationContext

public interface ConfigurableApplicationContext extends ApplicationContext, Lifecycle, Closeable {

该接口是SPI ( Server Provider Interface )接口,被大部分applicationcontext实现,功能:提供对application context配置的设施;

《一 spring源码分析--- IOC容器》

到此为止,Spring容器的核心接口基本上分析完了,大致了解了这些核心接口的功能,以及随着接口的扩展,功能越来越强大,可以看到面向接口编程的威力。
接下来主要对ConfigurableApplicationContext下面的接口进行分析,最终要揭示spring容器如何启动以及实例化Bean的。

结构图

《一 spring源码分析--- IOC容器》

在这张结构图中,主要关注点是AbstractApplicationContext,可以看到AbstractApplicationContext继承了ResourceLoader的默认实现DefaultResourceLoader,并且实现了接口DisposableBean;

1.DisposableBean
通常是被spring bean实现的接口,主要用来释放资源,例如当销毁一个缓存的单例时,就会调用该方法;当application context 关闭时,会销毁所有的singletons;

《一 spring源码分析--- IOC容器》

2.AbstractApplicationContext
抽象类,在该类中主要使用了模板方法的设计模式,在该类中注册了一下功能
BeanFactoryPostProcessor
BeanPostProcessors
ApplicationListeners
MessageSource
LifecycleProcessor

在该抽象类中,完成Spring IOC 容器加载的方法 refresh()非常重要,该方法是spring ioc容器的boot入口
下节中分析refresh()方法是如何完成IOC容器初始化的;

    原文作者:Spring MVC
    原文地址: https://blog.csdn.net/yamorn/article/details/44062371
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞