Spring源码解读:核心类DefaultListableBeanFactory的继承体系
1 简介
我们常用的ClassPathXmlApplicationContext是AbstractRefreshableApplicationContext的子类,而DefaultListableBeanFactory类型的beanFactory又是AbstractRefreshableApplicationContext的一个成员属性,也就是说ClassPathXmlApplicationContext运用了组合的方式扩展了DefaultListableBeanFactory的功能,使其自身成为了一个上下文容器。
另外XmlBeanFactory继承自DefaultListableBeanFactory,而DefaultListableBeanFactory是整个bean加载的核心部分,是 Spring 注册及加载 bean 的默认实现.
而对于 XmlBeanFactory与DefaultListableBeanFactory 不同的地方其实是在 XmlBeanFactory 中使用了自定义的XML 读取器XmlBeanDefinitionReader,实现了个性化的BeanDefinitionReader读取DefaultListableBeanFactory继承了 AbstractAutowireCapableBeanFactory 并实现了ConfigurableListableBeanFactory 以及BeanDefinitionRegistry接口。
2 继承层次分析
DefaultListableBeanFactory的继承体系层次图
各个类的主要功能和API:
1)AliasRegistry
定义对alias的简单增删改等操作
//通用的别名管理接口 public interface AliasRegistry { //Given a name, register an alias for it. void registerAlias(String name, String alias); /** * Remove the specified alias from this registry. */ void removeAlias(String alias); /** * Determine whether this given name is defines as an alias * (as opposed to the name of an actually registered component). */ boolean isAlias(String name); /** * Return the aliases for the given name, if defined. */ String[] getAliases(String name); }
2)SimpleAliasRegistry
主要使用map作为alias的缓存,并对接口AliasRegistry进行实现.
3)SingletonBeanRegistry
定义对单例的注册及获取
//Interface that defines a registry for shared bean instances. public interface SingletonBeanRegistry { /** * Register the given existing object as singleton in the bean registry, * under the given bean name. */ void registerSingleton(String beanName, Object singletonObject); /** * Return the (raw) singleton object registered under the given name. */ @Nullable Object getSingleton(String beanName); /** * Check if this registry contains a singleton instance with the given name. */ boolean containsSingleton(String beanName); /** * Return the names of singleton beans registered in this registry. */ String[] getSingletonNames(); /** * Return the number of singleton beans registered in this registry. */ int getSingletonCount(); /** * Return the singleton mutex used by this registry (for external collaborators). */ Object getSingletonMutex(); }
4)BeanDefinitionRegistry
定义对BeanDefinition的各种增删改操作
/** * Interface for registries that hold bean definitions, for example RootBeanDefinition * and ChildBeanDefinition instances. Typically implemented by BeanFactories that * internally work with the AbstractBeanDefinition hierarchy. */ public interface BeanDefinitionRegistry extends AliasRegistry { /** * Register a new bean definition with this registry. * Must support RootBeanDefinition and ChildBeanDefinition. */ void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException; /** * Remove the BeanDefinition for the given name. */ void removeBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /** * Return the BeanDefinition for the given bean name. */ BeanDefinition getBeanDefinition(String beanName) throws NoSuchBeanDefinitionException; /** * Check if this registry contains a bean definition with the given name. */ boolean containsBeanDefinition(String beanName); /** * Return the names of all beans defined in this registry. */ String[] getBeanDefinitionNames(); /** * Return the number of beans defined in the registry. */ int getBeanDefinitionCount(); /** * Determine whether the given bean name is already in use within this registry, * i.e. whether there is a local bean or alias registered under this name. */ boolean isBeanNameInUse(String beanName); }
5)BeanFactory
定义获取bean及bean的各种属性。
6)DefaultSingletonBeanRegistry
对接口SingletonBeanRegistry各函数的实现
7)HierarchicalBeanFactory
扩展了BeanFactory,新增了两个抽象方法,提供了对父工厂parentBeanFactory和内嵌Bean的支持
/** * Sub-interface implemented by bean factories that can be part * of a hierarchy. */ public interface HierarchicalBeanFactory extends BeanFactory { /** * Return the parent bean factory, or {@code null} if there is none. */ BeanFactory getParentBeanFactory(); /** * Return whether the local bean factory contains a bean of the given name, * ignoring beans defined in ancestor contexts. */ boolean containsLocalBean(String name); }
8)ListableBeanFactory
提供了以类型、名字、注解等条件获取相关bean的各种配置信息的抽象方法。
9)FactoryBeanRegistrySupport
在DefaultSingletonBeanRegistry基础上增加了对
FactoryBean的特殊处理功能,没有新增的公用API,几乎全是protected级别的方法(主要是对FactoryBean的支持,FactoryBean不返回实例本身,而是返回此工厂方法getBean()的返回对象),以供子类调用或重写。
10)ConfigurableBeanFactory
其公用API主要是以“setXXX"、“getXXX”、"registerXXX"开头的设定或获取配置的方法,它提供配置Bean的各种方法。
部分API图
11)AbstractBeanFactory
综合 FactoryBeanRegistrySupport与ConfigurableBeanFactory的功能,即综合了支持父工厂和配置bean的两种功能。
部分API图
12)AutowireCapableBeanFactory
提供创建bean、自动注入、初始化以及应用bean的后处理器
13)ConfigurableListableBeanFactory
BeanFactory配置清单,指定忽略类型及接口等
14)AbstractAutowireCapableBeanFactory
综合AbstractBeanFactory并对接口AutowireCapableBeanFactory进行实现
部分API图
15)DefaultListableBeanFactory
综合上面所有功能,主要是对Bean注册后的处理.
参考:《Spring源码深度解析(第2版)》