BeanFactory接口是Spring ioc容器的核心接口,它提供了从容器获取bean以及bean信息的最基本功能。BeanFactory接口中所定义的几个方法很简单,为了在ioc容器中提供更多的功能,spring框架中提供了许多BeanFactory功能的子接口与实现。按照“单一职责”的设计原则,每一次接口的扩展,将在其原有父接口的基础子上增加新的功能。
ApplicationContext接口是BeanFactory接口的子接口,在包含BeanFactory所提供的全部功能之外,其功能得到了更大的增强,包括各种不同应用层的context实现,国际化消息资源处理,各种不同路径不同类型的资源加载,application Event事件发布等,ApplicationContext能够更加好地满足不同企业应用的各种不同需求。在Spring框架中,ApplicationContext接口也有许多子接口与实现,通过层层扩展与实现,最终ApplicationContext形成了一个功能强大的ioc容器。
BeanFactory接口继承体系(仅列出一些较核心的接口与类):
一个接口一个责任,层次非常清晰
n BeanFactory接口: spring ioc容器核心接口,主要功能为根据bean的名称获取bean或bean的信息,提供的接口功能有:
查找是否有指定名称的bean,
根据名称获取bean,
根据名称获取所有的别名,
根据名称获取bean的class类型,
根据名称判断bean是否是单例或prototype
判断名称为name的bean是否与指定类型相匹配
n ListableBeanFactory接口:继承自BeanFactory,提供对容器内的bean的枚举与遍历功能,主要功能有:
查找是否有指定名称bean的定义
获取容器内bean的数量及所有bean的名称
根据指定类型获取bean的集合
n HierarchicalBeanFactory接口:继承自BeanFactory,支持父子BeanFactory的继承,主要功能有判断当前BeanFactory中是否含有指定名称的bean、获取父BeanFactory。
n ConfigurableBeanFactory接口:继承自HierarchicalBeanFactory和SingletonBeanRegistry接口,为beanFactory添加了一些配置的功能,包括添加BeanPostProcessor
后置处理器、PropertyEditorRegistrar属性编辑器、别名,设置父beanFactory、类加载器缓存,并提供了对Scope的支持,除此之外还有销毁bean和容器中所有单例,获取后置处理器数量,类型转换器,复制ConfigurableBeanFactory 信息,判断指定的bean当前是否正在创建等功能。同时,由于该接口继承自
SingletonBeanRegistry接口,因此其也具有管理beanFactory中的单例对象的功能。
n AutowireCapableBeanFactory接口:继承自BeanFactory,提供自动装配的功能
n ConfigurableListableBeanFactory接口:继承自ListableBeanFactory, AutowireCapableBeanFactory, ConfigurableBeanFactory此三个接口,并定义了获取BeanDefinition和预先实例化单例bean的功能。
n AbstractBeanFactory类:对BeanFactory接口进行了基础性的实现,提供了ConfigurableBeanFactory接口的所有功能。其功能和特点主要有:
通过继承自DefaultSingletonBeanRegistry类,提供了对单例对象的cache缓存
可以根据bean名称,决定对象是prototype还是单例类型
Bean别名的支持
Bean定义RootBeanDefinition和ChildBeanDefinition的合并
FactoryBean创建bean与其本身的支持
Bean析构时调用destroy()方法或其本身配置的销毁方法进行后置处理
实现了HierarchicalBeanFactory接口,支持BeanFactory容器的父子继承关系
本类给其子类留下了三个抽象方法:
boolean containsBeanDefinition(String beanName);
BeanDefinition getBeanDefinition(String beanName);
createBean(String beanName, RootBeanDefinition mbd, Object[] args);
ApplicationContext接口继承体系(仅列出一些较核心的接口与类):
n ApplicationContext接口: spring context核心接口,其由BeanFactory接口的子接口扩展而来,因此具有BeanFactory的所有功能,又因为其继承了MessageSource, ApplicationEventPublisher, ResourcePatternResolver接口,因此又具有国际化消息解析,资源加载,ApplicationEvent事件发布的功能。在此接口自己定义的方法中提供了获取父ApplicationContext、获取自动装配bean工厂,获取启动时间和显示名称这四项功能。
n ConfigurableApplicationContext接口:继承自ApplicationContext和Lifecycle接口,为客户端提供了配置与定制ApplicationContext相关设置的功能,主要内容有:
设置父ApplicationContext
添加BeanFactory后置处理器BeanFactoryPostProcessor
添加ApplicationListener
获取ApplicationContext内部的BeanFactory(ConfigurableListableBeanFactory类型)
刷新与关闭applicaionContext
注册关闭时的shutdown hook
判断当前applicationcontext是否处于活动(active状态)
n AbstractApplicationContext类:对ApplicationContext进行抽象实现,其内部的refresh()方法实现了ApplicationContext的启动流程,其doClose()方法则实现了applicationcontext的关闭流程。另外对其继承的多个接口中的方法,均有默认实现。
此类给子类留下了三个抽象方法:
ConfigurableListableBeanFactory getBeanFactory();
void closeBeanFactory();
void refreshBeanFactory();
n AbstractRefreshableApplicationContext类:继承自AbstractApplicationContext类,支持多次刷新。此类对其基类AbstractApplicationContext所留下的三个方法均进行了默认实现,其中在refreshBeanFactory()方法中完成了刷新的功能,并调用了createBeanFactory()方法创建一个DefaultListableBeanFactory对象来作为代理的内部类,在其子类的实现中将通过此beanFactory来加载配置中的BeanDefinition,创建和管理bean。
此类只留给子类一个抽象方法:
void loadBeanDefinitions(DefaultListableBeanFactory beanFactory);
从beanFactory中加载beanDefinitions。
n AbstractXmlApplicationContext类:继承自AbstractRefreshableApplicationContext类,其内部实现了从xml配置文件中加载和解析beanDefinition