注:本文所有的源码对应spring jar version为4.2.4
类图
开篇先给出DefaultListableBeanFactory类图,本篇将根据类图的继承关系从上往下依次分析。
相关类介绍
- AliasRegistry:定义alias相关的简单的增删改查等操作;
- SimpleAliasRegistry:实现接口AliasRegistry,使用map做alias的缓存;
- SingletonBeanRegistry:定义单例的注册及获取;
- BeanFactory:定义获取bean及bean的各种特性;
- DefaultSingletonBeanRegistry:实现接口SingletonBeanRegistry;
- HierarchicalBeanFactory:继承BeanFatory,并且在BeanFactory定义的功能的基础上增加了对parentFactory的支持;
- BeanDefinitionRegistry:定义对BeanDefinition的增删改等操作;
- FactoryBeanRegistrySupport:在DefaultSingletonBeanRegistry基础上增加了对FactoryBean的特殊处理功能;
- ConfigurableBeanFactory:提供配置Factory的各种方法;
- ListableBeanFactory:根据各种条件获取bean的配置清单;
- AbstractBeanFactory:综合FactoryBeanRegistrySupport和ConfigurableBeanFactory的功能;
- AutowireCapableBeanFactory:提供bean的创建、自动注入、初始化和应用bean的后处理器;
- AbstractAutowireCapableBeanFactory:综合AbstractBeanFactory并实现接口AutowireCapableBeanFactory;
- ConfigurableListableBeanFactory:BeanFactory配置清单;
- DefaultListableBeanFactory:综合上面所有的功能,对bean做处理后的注册。
具体源码分析
根据类图发现AliasRegistry、SingletonBeanRegistry、BeanFactory这三个类是最上层的父类,我们就先从这三个类开始分析。
AliasRegistry:
先上源码:
/**
* 定义bean别名相关操作
*/
public interface AliasRegistry {
/**
* 给该name的bean定义一个别名
* @param name bean的name
* @param alias 别名
* @throws IllegalStateException 别名已经存在或者不能被继承的bean抛出该异常
*/
void registerAlias(String name, String alias);
/**
* 移除指定的别名
* @param alias 需要移除的别名
* @throws IllegalStateException 别名不存在是抛出该异常
*/
void removeAlias(String alias);
/**
* 判断name是否是已经注册的别名
* @param name
* @return true/false
*/
boolean isAlias(String name);
/**
* 返回该name注册的所有的别名
* @param name
* @return
*/
String[] getAliases(String name);
}
具体的注释在代码中已经详细给出,具体的其他的讲解在此不做赘述。
SingletonBeanRegistry:
源码:
/**
* 定义对单例的注册及获取
*/
public interface SingletonBeanRegistry {
/**
* 单例注册
* @param beanName
* @param singletonObject
*/
void registerSingleton(String beanName, Object singletonObject);
/**
* 根据beanName获取单例
* @param beanName
* @return
*/
Object getSingleton(String beanName);
/**
* 判断该bean是否已经有注册的单例
* @param beanName
* @return
*/
boolean containsSingleton(String beanName);
/**
* 获取所有已注册单例的bean的name
* @return
*/
String[] getSingletonNames();
/**
* 计算已注册的单例数量
* @return
*/
int getSingletonCount();
/**
* return the singleton mutex used by this registry
* @return
*/
Object getSingletonMutex();
}
BeanFactory:
源码:
/**
* 定义获取bean以及bean的相关属性
*/
public interface BeanFactory {
/**
* 标识符,用以区分是否是由FactoryBean创建
*/
String FACTORY_BEAN_PREFIX = "&";
/**
* 根据name返回该类的一个实例
* @param name bean的name
* @return 类的实例
* @throws BeansException 没有该类的时候抛出该异常
*/
Object getBean(String name) throws BeansException;
/**
* 根据name返回一个指定类型的实例
* @param name bean的name
* @param requiredType 指定的类型
* @param <T>
* @return 类的指定类型实例
* @throws NoSuchBeanDefinitionException 没有该类的定义的时候抛出该异常
* @throws BeanNotOfRequiredTypeException 该类没有指定的类型时抛出该异常
* @throws BeansException 类不能被创建的时候抛出该异常
*/
<T> T getBean(String name, Class<T> requiredType) throws BeansException;
/**
* 返回符合指定类型的类的实例
* @param requiredType 指定类型
* @param <T>
* @return 指定类型的类的实例
* @throws NoSuchBeanDefinitionException 没有符合该类型的类的定义时抛出该异常
* @throws NoUniqueBeanDefinitionException 符合该类型的类超过一个时抛出该异常
* @throws BeansException 类不能被创建的时候抛出该异常
*/
<T> T getBean(Class<T> requiredType) throws BeansException;
/**
* 根据name返回该类的一个实例
* @param name bean的name
* @param args 创建实例需要的参数
* @return 类的实例
* @throws NoSuchBeanDefinitionException 没有该类的定义时抛出该异常
* @throws BeanDefinitionStoreException
* @throws BeansException 类不能被创建的时候抛出该异常
*/
Object getBean(String name, Object... args) throws BeansException;
/**
* 返回符合指定类型的类的实例
* @param requiredType 指定类型
* @param args 创建实例需要的参数
* @param <T>
* @return 类的实例
* @throws NoSuchBeanDefinitionException 没有符合该类型的类的定义时抛出该异常
* @throws BeanDefinitionStoreException
* @throws BeansException 类不能被创建的时候抛出该异常
*/
<T> T getBean(Class<T> requiredType, Object... args) throws BeansException;
/**
* 判断factory中是否包含指定name的bean的定义或者是否已经注册了单例
* @param name
* @return
*/
boolean containsBean(String name);
/**
* 判断该name的bean是否是单例
* @param name bean的name
* @return
* @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
*/
boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
/**
* 判断该name的bean是否是java prototype
* @param name
* @return
* @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
*/
boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
/**
* 判断是否存在符合特殊类型的bean
* @param name bean的name
* @param typeToMatch 符合的特殊类型type
* @return
* @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
*/
boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 判断是否存在符合指定类型的bean
* @param name bean的name
* @param typeToMatch 指定类型type
* @return
* @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
*/
boolean isTypeMatch(String name, Class<?> typeToMatch) throws NoSuchBeanDefinitionException;
/**
* 返回该name的bean的类型
* @param name bean的name
* @return bean的类型
* @throws NoSuchBeanDefinitionException 该name没有相应的bean的时候抛出该异常
*/
Class<?> getType(String name) throws NoSuchBeanDefinitionException;
/**
* 返回该name的bean的所有的别名
* @param name bean的name
* @return 该bean的别名
*/
String[] getAliases(String name);
}
看完三个基本的父类之后,我们依次往下看相关的源码。考虑到后面的源码量比较大,我会在后文中给出具体的源码分析。