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

来源:互联网 发布:dlp数据防泄密 知乎 编辑:程序博客网 时间:2024/06/05 12:08

前言

在分析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容器元老级的几个接口


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

1.BeanFactory

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


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


2.ConfigurableListableBeanFactory

public interface ConfigurableListableBeanFactoryextends ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory {

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


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 {

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


到此为止,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容器初始化的;

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 浴缸下水口漏水怎么办 浴缸下水器漏水怎么办 铁皮接头处漏水怎么办 马桶被堵死了怎么办 家里灯泡坏了怎么办 家里电路烧了怎么办 如果电脑开不了怎么办 热水器水管子漏水怎么办 淋浴头开关滴水怎么办 淋浴头一直滴水怎么办 饮水机放桶漏水怎么办 热水器热水阀门漏水怎么办 热水器热水出口漏水怎么办 热水器上水管漏水怎么办 水管往外漏水怎么办 ppr热水管漏水怎么办 大半夜水闸爆了怎么办 热水器不热水了怎么办 水龙头外皮裂了怎么办 电热水龙头坏了怎么办 太阳能存不住水怎么办 混水阀断裂漏水怎么办 洗澡淋浴头漏水怎么办 马桶有异物堵住怎么办 捷达机油盖漏油怎么办 乳化油臭了怎么办 自行车前叉严重生锈怎么办 自行车链条生锈了怎么办 自行车链子生锈了怎么办 对切削液过敏怎么办 齿轮油加到机油怎么办 机油加液压油里怎么办 液压油里面有水怎么办 加油站双层复合管漏油怎么办 预制屋面板底面渗漏怎么办 焊电焊眼睛疼怎么办 下水主管道篦子怎么办 墙里热水管堵了怎么办 热水管堵住了怎么办 热水管堵塞了怎么办 下水道被油渍堵死怎么办